1 /******************************************************************************
2 *
3 * Copyright 2015 Google, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19 #include "device/include/interop.h"
20
21 #include <gtest/gtest.h>
22
23 #include "btcore/include/module.h"
24 #include "device/include/interop_config.h"
25 #include "types/raw_address.h"
26
27 #ifndef __ANDROID__
28 #include <base/files/file_util.h>
29 #include <unistd.h>
30
31 #include <filesystem>
32 #include <system_error>
33
34 static const std::filesystem::path kStaticConfigFileConfigFile =
35 std::filesystem::temp_directory_path() / "interop_database.conf";
36
37 static const char* INTEROP_STATIC_FILE_PATH = kStaticConfigFileConfigFile.c_str();
38 static const char INTEROP_STATIC_FILE_CONTENT[] =
39 " \n\
40 #Disable secure connections \n\
41 #This is for pre BT 4.1/2 devices that do not handle secure mode very well. \n\
42 [INTEROP_DISABLE_LE_SECURE_CONNECTIONS] \n\
43 08:62:66 = Address_Based \n\
44 38:2C:4A:E6 = Address_Based \n\
45 \n\
46 # Disable automatic pairing with headsets/car-kits \n\
47 # Some car kits do not react kindly to a failed pairing attempt and \n\
48 # do not allow immediate re-pairing. Denylist these so that the initial \n\
49 # pairing attempt makes it to the user instead \n\
50 [INTEROP_DISABLE_AUTO_PAIRING] \n\
51 34:C7:31 = Address_Based \n\
52 Audi = Name_Based \n\
53 BMW = Name_Based \n\
54 \n\
55 # Devices requiring this workaround do not handle Bluetooth Absolute Volume \n\
56 # control correctly, leading to undesirable (potentially harmful) volume levels \n\
57 # or general lack of controlability. \n\
58 [INTEROP_DISABLE_ABSOLUTE_VOLUME] \n\
59 A0:E9:DB = Address_Based \n\
60 00:0f:59:50:00:00-00:0f:59:6f:ff:ff = Address_Range_Based \n\
61 \n\
62 # HID Keyboards that claim support for multitouch functionality have issue with \n\
63 # normal functioning of keyboard because of issues in USB HID kernel driver. \n\
64 # To avoid degrading the user experience with those devices, digitizer record \n\
65 # is removed from the report descriptor. \n\
66 [INTEROP_REMOVE_HID_DIG_DESCRIPTOR] \n\
67 Motorola Keyboard KZ500 = Name_Based \n\
68 0x22b8-0x093D = Vndr_Prdt_Based \n\
69 \n\
70 # some remote hid devices cannot work properly as they load special hid usb driver in kernel,\n\
71 # so modify their vid/pid so that generic hid driver are loaded. \n\
72 [INTEROP_CHANGE_HID_VID_PID] \n\
73 CK87BT = Name_Based \n\
74 0x05ac-0x0255 = Vndr_Prdt_Based \n\
75 \n\
76 # Some HID devices have problematic behaviour where when hid link is in Sniff \n\
77 # and DUT is in Peripheral role for SCO link ( not eSCO) any solution cannot maintain \n\
78 # the link as SCO scheduling over a small period will overlap with Sniff link due to \n\
79 # peripheral drift. \n\
80 # To avoid degrading the user experience with those devices, sniff is disabled from \n\
81 # link policy when sco is active, and enabled when sco is disabled. \n\
82 [INTEROP_DISABLE_SNIFF_DURING_SCO] \n\
83 20:4C:10 = Address_Based \n\
84 0x004C = Manufacturer_Based \n\
85 \n\
86 # Devices requiring this workaround do not handle SSR max latency values as mentioned, \n\
87 # in their SDP HID Record properly and lead to connection timeout or lags. To prevent \n\
88 # such scenarios, device requiring this workaround need to use specific ssr max latency \n\
89 # values. \n\
90 [INTEROP_UPDATE_HID_SSR_MAX_LAT] \n\
91 00:1B:DC-0x0012 = SSR_Max_Lat_Based \n\
92 DC:2C:26-0x0000 = SSR_Max_Lat_Based \n\
93 ";
94 #endif
95
96 extern const module_t interop_module;
97
98 class InteropTest : public ::testing::Test {
99 protected:
SetUp()100 virtual void SetUp() override {
101 #ifndef __ANDROID__
102 FILE* fp = fopen(INTEROP_STATIC_FILE_PATH, "wte");
103 ASSERT_NE(fp, nullptr);
104 ASSERT_EQ(fwrite(INTEROP_STATIC_FILE_CONTENT, 1, sizeof(INTEROP_STATIC_FILE_CONTENT), fp),
105 sizeof(INTEROP_STATIC_FILE_CONTENT));
106 // Force data to be flushed on disk and not only in user-space
107 ASSERT_EQ(fsync(fileno(fp)), 0) << "Associated ERRNO error is: " << strerror(errno);
108 ASSERT_EQ(fclose(fp), 0);
109 #endif
110 }
TearDown()111 virtual void TearDown() override {
112 #ifndef __ANDROID__
113 std::error_code ec;
114 EXPECT_TRUE(std::filesystem::remove(kStaticConfigFileConfigFile, ec))
115 << "Associated error is: " << ec;
116 #endif
117 }
118 };
119
TEST_F(InteropTest,test_lookup_hit)120 TEST_F(InteropTest, test_lookup_hit) {
121 module_init(&interop_module);
122
123 RawAddress test_address;
124
125 RawAddress::FromString("38:2c:4a:e6:67:89", test_address);
126 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
127
128 RawAddress::FromString("34:c7:31:12:34:56", test_address);
129 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_AUTO_PAIRING, &test_address));
130
131 #ifdef __ANDROID__
132 RawAddress::FromString("9c:df:03:12:34:56", test_address);
133 EXPECT_TRUE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
134
135 RawAddress::FromString("a0:e9:db:e6:67:89", test_address);
136 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
137
138 RawAddress::FromString("00:0f:f6:e6:67:89", test_address);
139 EXPECT_TRUE(interop_match_addr(INTEROP_KEYBOARD_REQUIRES_FIXED_PIN, &test_address));
140
141 RawAddress::FromString("00:18:91:12:34:56", test_address);
142 EXPECT_TRUE(interop_match_addr(INTEROP_2MBPS_LINK_ONLY, &test_address));
143
144 RawAddress::FromString("00:12:a1:e6:67:89", test_address);
145 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_AUTH_FOR_HID_POINTING, &test_address));
146
147 RawAddress::FromString("20:4c:10:12:34:56", test_address);
148 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address));
149
150 RawAddress::FromString("00:14:09:e6:67:89", test_address);
151 EXPECT_TRUE(interop_match_addr(INTEROP_INCREASE_AG_CONN_TIMEOUT, &test_address));
152
153 RawAddress::FromString("fc:c2:de:12:34:56", test_address);
154 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_ROLE_SWITCH, &test_address));
155
156 RawAddress::FromString("28:a1:83:9c:20:a8", test_address);
157 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_AAC_CODEC, &test_address));
158
159 RawAddress::FromString("28:83:35:7a:5f:23", test_address);
160 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_AAC_VBR_CODEC, &test_address));
161
162 RawAddress::FromString("b8:ad:3e:12:34:56", test_address);
163 EXPECT_TRUE(interop_match_addr(INTEROP_ENABLE_AAC_CODEC, &test_address));
164
165 RawAddress::FromString("ac:fd:ce:e6:67:89", test_address);
166 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_PCE_SDP_AFTER_PAIRING, &test_address));
167
168 RawAddress::FromString("98:7b:f3:12:34:56", test_address);
169 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_HF_INDICATOR, &test_address));
170
171 RawAddress::FromString("04:52:c7:e6:67:89", test_address);
172 EXPECT_TRUE(interop_match_addr(INTEROP_DELAY_SCO_FOR_MT_CALL, &test_address));
173
174 RawAddress::FromString("04:52:c7:12:34:56", test_address);
175 EXPECT_TRUE(interop_match_addr(INTEROP_DELAY_SCO_FOR_MT_CALL, &test_address));
176
177 RawAddress::FromString("00:08:8a:f0:1d:8a", test_address);
178 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_CODEC_NEGOTIATION, &test_address));
179
180 RawAddress::FromString("a0:56:b2:4f:86:a8", test_address);
181 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_PLAYER_APPLICATION_SETTING_CMDS, &test_address));
182
183 RawAddress::FromString("a0:14:3d:e6:67:89", test_address);
184 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_CONNECTION_AFTER_COLLISION, &test_address));
185
186 RawAddress::FromString("38:2c:4a:c9:34:56", test_address);
187 EXPECT_TRUE(interop_match_addr(INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S, &test_address));
188
189 RawAddress::FromString("00:1d:86:e6:67:89", test_address);
190 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_AVDTP_RECONFIGURE, &test_address));
191
192 RawAddress::FromString("2c:dc:ad:08:91:89", test_address);
193 EXPECT_TRUE(interop_match_addr(INTEROP_AVRCP_BROWSE_OPEN_CHANNEL_COLLISION, &test_address));
194
195 RawAddress::FromString("10:b7:f6:03:38:b0", test_address);
196 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_SNIFF_DURING_CALL, &test_address));
197
198 RawAddress::FromString("00:0e:9f:12:34:56", test_address);
199 EXPECT_TRUE(interop_match_addr(INTEROP_SKIP_INCOMING_STATE, &test_address));
200
201 RawAddress::FromString("98:b6:e9:e6:67:89", test_address);
202 EXPECT_TRUE(interop_match_addr(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL, &test_address));
203
204 RawAddress::FromString("04:4e:af:a8:a0:01", test_address);
205 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_REFRESH_ACCEPT_SIG_TIMER, &test_address));
206
207 RawAddress::FromString("bc:30:7e:5e:f6:27", test_address);
208 EXPECT_TRUE(interop_match_addr(INTEROP_NOT_UPDATE_AVRCP_PAUSED_TO_REMOTE, &test_address));
209
210 RawAddress::FromString("10:4f:a8:08:91:89", test_address);
211 EXPECT_TRUE(interop_match_addr(INTEROP_PHONE_POLICY_REDUCED_DELAY_CONNECT_OTHER_PROFILES,
212 &test_address));
213
214 RawAddress::FromString("00:15:83:03:38:b0", test_address);
215 EXPECT_TRUE(interop_match_addr(INTEROP_HFP_FAKE_INCOMING_CALL_INDICATOR, &test_address));
216
217 RawAddress::FromString("00:09:93:a6:c5:4d", test_address);
218 EXPECT_TRUE(interop_match_addr(INTEROP_DELAY_SCO_FOR_MO_CALL, &test_address));
219
220 RawAddress::FromString("48:eb:62:e6:67:89", test_address);
221 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_ROLE_SWITCH_DURING_CONNECTION, &test_address));
222
223 RawAddress::FromString("9c:df:03:a8:a0:01", test_address);
224 EXPECT_TRUE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
225
226 RawAddress::FromString("d4:7a:e2:5e:f6:27", test_address);
227 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_NAME_REQUEST, &test_address));
228
229 RawAddress::FromString("48:f0:7b:08:91:89", test_address);
230 EXPECT_TRUE(interop_match_addr(INTEROP_AVRCP_1_4_ONLY, &test_address));
231
232 RawAddress::FromString("00:0a:08:03:38:b0", test_address);
233 EXPECT_TRUE(interop_match_addr(INTEROP_AVRCP_1_3_ONLY, &test_address));
234
235 RawAddress::FromString("44:ea:d8:a6:c5:4d", test_address);
236 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_SNIFF, &test_address));
237
238 RawAddress::FromString("94:b2:cc:30:c5:4d", test_address);
239 EXPECT_TRUE(interop_match_addr(INTEROP_SLC_SKIP_BIND_COMMAND, &test_address));
240 #endif
241
242 module_clean_up(&interop_module);
243 }
244
TEST_F(InteropTest,test_lookup_miss)245 TEST_F(InteropTest, test_lookup_miss) {
246 module_init(&interop_module);
247
248 RawAddress test_address;
249
250 RawAddress::FromString("00:00:00:00:00:00", test_address);
251 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
252
253 RawAddress::FromString("ff:ff:ff:ff:ff:ff", test_address);
254 EXPECT_FALSE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
255
256 RawAddress::FromString("42:08:15:ae:ae:ae", test_address);
257 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
258
259 RawAddress::FromString("38:2c:4a:59:67:89", test_address);
260 EXPECT_FALSE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
261
262 RawAddress::FromString("ff:ff:ff:ff:ff:ff", test_address);
263 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
264 EXPECT_FALSE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
265 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
266 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_AUTO_PAIRING, &test_address));
267 EXPECT_FALSE(interop_match_addr(INTEROP_KEYBOARD_REQUIRES_FIXED_PIN, &test_address));
268 EXPECT_FALSE(interop_match_addr(INTEROP_2MBPS_LINK_ONLY, &test_address));
269 EXPECT_FALSE(interop_match_addr(INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S, &test_address));
270 EXPECT_FALSE(interop_match_addr(INTEROP_GATTC_NO_SERVICE_CHANGED_IND, &test_address));
271 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_SDP_AFTER_PAIRING, &test_address));
272 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_AUTH_FOR_HID_POINTING, &test_address));
273 EXPECT_FALSE(interop_match_addr(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, &test_address));
274 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address));
275 EXPECT_FALSE(interop_match_addr(INTEROP_INCREASE_AG_CONN_TIMEOUT, &test_address));
276 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, &test_address));
277 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_AAC_CODEC, &test_address));
278 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_AAC_VBR_CODEC, &test_address));
279 EXPECT_FALSE(interop_match_addr(INTEROP_DYNAMIC_ROLE_SWITCH, &test_address));
280 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_ROLE_SWITCH, &test_address));
281 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_ROLE_SWITCH_POLICY, &test_address));
282 EXPECT_FALSE(interop_match_addr(INTEROP_HFP_1_7_DENYLIST, &test_address));
283 EXPECT_FALSE(interop_match_addr(INTEROP_ADV_PBAP_VER_1_1, &test_address));
284 EXPECT_FALSE(interop_match_addr(INTEROP_UPDATE_HID_SSR_MAX_LAT, &test_address));
285 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_AVDTP_RECONFIGURE, &test_address));
286 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_HF_INDICATOR, &test_address));
287 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_CONN_UPDATES, &test_address));
288 EXPECT_FALSE(interop_match_addr(INTEROP_DELAY_SCO_FOR_MT_CALL, &test_address));
289 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_CODEC_NEGOTIATION, &test_address));
290 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_PLAYER_APPLICATION_SETTING_CMDS, &test_address));
291 EXPECT_FALSE(interop_match_addr(INTEROP_ENABLE_AAC_CODEC, &test_address));
292 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_CONNECTION_AFTER_COLLISION, &test_address));
293 EXPECT_FALSE(interop_match_addr(INTEROP_AVRCP_BROWSE_OPEN_CHANNEL_COLLISION, &test_address));
294 EXPECT_FALSE(interop_match_addr(INTEROP_ADV_PBAP_VER_1_2, &test_address));
295 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_PCE_SDP_AFTER_PAIRING, &test_address));
296 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_SNIFF_LINK_DURING_SCO, &test_address));
297 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_SNIFF_DURING_CALL, &test_address));
298 EXPECT_FALSE(interop_match_addr(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL, &test_address));
299 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_REFRESH_ACCEPT_SIG_TIMER, &test_address));
300 EXPECT_FALSE(interop_match_addr(INTEROP_SKIP_INCOMING_STATE, &test_address));
301 EXPECT_FALSE(interop_match_addr(INTEROP_NOT_UPDATE_AVRCP_PAUSED_TO_REMOTE, &test_address));
302 EXPECT_FALSE(interop_match_addr(INTEROP_PHONE_POLICY_INCREASED_DELAY_CONNECT_OTHER_PROFILES,
303 &test_address));
304 EXPECT_FALSE(interop_match_addr(INTEROP_PHONE_POLICY_REDUCED_DELAY_CONNECT_OTHER_PROFILES,
305 &test_address));
306 EXPECT_FALSE(interop_match_addr(INTEROP_HFP_FAKE_INCOMING_CALL_INDICATOR, &test_address));
307 EXPECT_FALSE(interop_match_addr(INTEROP_HFP_SEND_CALL_INDICATORS_BACK_TO_BACK, &test_address));
308 EXPECT_FALSE(
309 interop_match_addr(INTEROP_SETUP_SCO_WITH_NO_DELAY_AFTER_SLC_DURING_CALL, &test_address));
310 EXPECT_FALSE(interop_match_addr(INTEROP_ENABLE_PREFERRED_CONN_PARAMETER, &test_address));
311 EXPECT_FALSE(interop_match_addr(INTEROP_RETRY_SCO_AFTER_REMOTE_REJECT_SCO, &test_address));
312 EXPECT_FALSE(interop_match_addr(INTEROP_DELAY_SCO_FOR_MO_CALL, &test_address));
313 EXPECT_FALSE(interop_match_addr(INTEROP_CHANGE_HID_VID_PID, &test_address));
314 EXPECT_FALSE(interop_match_addr(END_OF_INTEROP_LIST, &test_address));
315 EXPECT_FALSE(interop_match_addr(INTEROP_HFP_1_8_DENYLIST, &test_address));
316 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_ROLE_SWITCH_DURING_CONNECTION, &test_address));
317 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_NAME_REQUEST, &test_address));
318 EXPECT_FALSE(interop_match_addr(INTEROP_AVRCP_1_4_ONLY, &test_address));
319 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_SNIFF, &test_address));
320 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_AVDTP_SUSPEND, &test_address));
321 EXPECT_FALSE(interop_match_addr(INTEROP_SLC_SKIP_BIND_COMMAND, &test_address));
322 EXPECT_FALSE(interop_match_addr(INTEROP_AVRCP_1_3_ONLY, &test_address));
323
324 module_clean_up(&interop_module);
325 }
326
TEST_F(InteropTest,test_dynamic_db_clear)327 TEST_F(InteropTest, test_dynamic_db_clear) {
328 module_init(&interop_module);
329
330 RawAddress test_address;
331
332 RawAddress::FromString("11:22:33:44:55:66", test_address);
333 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
334
335 interop_database_add(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address, 3);
336 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
337 EXPECT_FALSE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
338
339 RawAddress::FromString("66:55:44:33:22:11", test_address);
340 EXPECT_FALSE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
341
342 interop_database_add(INTEROP_AUTO_RETRY_PAIRING, &test_address, 3);
343 EXPECT_TRUE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
344 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
345
346 interop_database_clear();
347
348 EXPECT_FALSE(interop_match_addr(INTEROP_AUTO_RETRY_PAIRING, &test_address));
349
350 module_clean_up(&interop_module);
351 }
352
TEST_F(InteropTest,test_name_hit)353 TEST_F(InteropTest, test_name_hit) {
354 module_init(&interop_module);
355
356 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AUTO_PAIRING, "BMW M3"));
357 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AUTO_PAIRING, "Audi"));
358
359 #ifdef __ANDROID__
360 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AUTO_PAIRING,
361 "Caramel")); // Starts with "Car" ;)
362
363 EXPECT_TRUE(interop_match_name(INTEROP_GATTC_NO_SERVICE_CHANGED_IND, "MiMouse"));
364 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AUTH_FOR_HID_POINTING,
365 "Targus BT Laser Notebook Mouse"));
366 EXPECT_TRUE(interop_match_name(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, "Motorola Keyboard KZ500"));
367 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, "BSMBB09DS"));
368 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, "DXCMog"));
369 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, "Dexcom 123"));
370 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, "DX01ab"));
371 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AAC_CODEC, "abramtek M1"));
372 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AAC_VBR_CODEC, "Audi_MMI_2781"));
373 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_AVDTP_RECONFIGURE, "KMM-BT51*HD"));
374 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_LE_CONN_UPDATES, "ITAG"));
375 EXPECT_TRUE(interop_match_name(INTEROP_DELAY_SCO_FOR_MT_CALL, "AirPods Pro"));
376 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_CODEC_NEGOTIATION, "JABRA EASYGO"));
377 EXPECT_TRUE(interop_match_name(INTEROP_ENABLE_AAC_CODEC, "MDR-1RBT"));
378 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_SNIFF_LINK_DURING_SCO, "AirPods"));
379 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_SNIFF_DURING_CALL, "AirPods"));
380 EXPECT_TRUE(interop_match_name(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL, "Joy-Con"));
381 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_REFRESH_ACCEPT_SIG_TIMER, "HB20"));
382 EXPECT_TRUE(interop_match_name(INTEROP_NOT_UPDATE_AVRCP_PAUSED_TO_REMOTE, "Audi"));
383 EXPECT_TRUE(
384 interop_match_name(INTEROP_SETUP_SCO_WITH_NO_DELAY_AFTER_SLC_DURING_CALL, "Geely_BT"));
385 EXPECT_TRUE(
386 interop_match_name(INTEROP_ENABLE_PREFERRED_CONN_PARAMETER, "Microsoft Bluetooth Mouse"));
387 EXPECT_TRUE(interop_match_name(INTEROP_RETRY_SCO_AFTER_REMOTE_REJECT_SCO, "HAVAL M6"));
388 EXPECT_TRUE(interop_match_name(INTEROP_CHANGE_HID_VID_PID, "CK87BT"));
389 #endif
390
391 module_clean_up(&interop_module);
392 }
393
TEST_F(InteropTest,test_name_miss)394 TEST_F(InteropTest, test_name_miss) {
395 module_init(&interop_module);
396
397 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AUTO_PAIRING, "__GOOGLE__"));
398 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AUTO_PAIRING, "BM"));
399 EXPECT_FALSE(interop_match_name(INTEROP_AUTO_RETRY_PAIRING, "BMW M3"));
400 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, "TEST"));
401 EXPECT_FALSE(interop_match_name(INTEROP_AUTO_RETRY_PAIRING, "TEST"));
402 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_ABSOLUTE_VOLUME, "TEST"));
403 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AUTO_PAIRING, "TEST"));
404 EXPECT_FALSE(interop_match_name(INTEROP_KEYBOARD_REQUIRES_FIXED_PIN, "TEST"));
405 EXPECT_FALSE(interop_match_name(INTEROP_2MBPS_LINK_ONLY, "TEST"));
406 EXPECT_FALSE(interop_match_name(INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S, "TEST"));
407 EXPECT_FALSE(interop_match_name(INTEROP_GATTC_NO_SERVICE_CHANGED_IND, "TEST"));
408 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_SDP_AFTER_PAIRING, "TEST"));
409 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AUTH_FOR_HID_POINTING, "TEST"));
410 EXPECT_FALSE(interop_match_name(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, "TEST"));
411 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_SNIFF_DURING_SCO, "TEST"));
412 EXPECT_FALSE(interop_match_name(INTEROP_INCREASE_AG_CONN_TIMEOUT, "TEST"));
413 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, "TEST"));
414 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AAC_CODEC, "TEST"));
415 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AAC_VBR_CODEC, "TEST"));
416 EXPECT_FALSE(interop_match_name(INTEROP_DYNAMIC_ROLE_SWITCH, "TEST"));
417 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_ROLE_SWITCH, "TEST"));
418 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_ROLE_SWITCH_POLICY, "TEST"));
419 EXPECT_FALSE(interop_match_name(INTEROP_HFP_1_7_DENYLIST, "TEST"));
420 EXPECT_FALSE(interop_match_name(INTEROP_ADV_PBAP_VER_1_1, "TEST"));
421 EXPECT_FALSE(interop_match_name(INTEROP_UPDATE_HID_SSR_MAX_LAT, "TEST"));
422 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AVDTP_RECONFIGURE, "TEST"));
423 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_HF_INDICATOR, "TEST"));
424 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_LE_CONN_UPDATES, "TEST"));
425 EXPECT_FALSE(interop_match_name(INTEROP_DELAY_SCO_FOR_MT_CALL, "TEST"));
426 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_CODEC_NEGOTIATION, "TEST"));
427 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_PLAYER_APPLICATION_SETTING_CMDS, "TEST"));
428 EXPECT_FALSE(interop_match_name(INTEROP_ENABLE_AAC_CODEC, "TEST"));
429 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_CONNECTION_AFTER_COLLISION, "TEST"));
430 EXPECT_FALSE(interop_match_name(INTEROP_AVRCP_BROWSE_OPEN_CHANNEL_COLLISION, "TEST"));
431 EXPECT_FALSE(interop_match_name(INTEROP_ADV_PBAP_VER_1_2, "TEST"));
432 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_PCE_SDP_AFTER_PAIRING, "TEST"));
433 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_SNIFF_LINK_DURING_SCO, "TEST"));
434 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_SNIFF_DURING_CALL, "TEST"));
435 EXPECT_FALSE(interop_match_name(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL, "TEST"));
436 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_REFRESH_ACCEPT_SIG_TIMER, "TEST"));
437 EXPECT_FALSE(interop_match_name(INTEROP_SKIP_INCOMING_STATE, "TEST"));
438 EXPECT_FALSE(interop_match_name(INTEROP_NOT_UPDATE_AVRCP_PAUSED_TO_REMOTE, "TEST"));
439 EXPECT_FALSE(
440 interop_match_name(INTEROP_PHONE_POLICY_INCREASED_DELAY_CONNECT_OTHER_PROFILES, "TEST"));
441 EXPECT_FALSE(
442 interop_match_name(INTEROP_PHONE_POLICY_REDUCED_DELAY_CONNECT_OTHER_PROFILES, "TEST"));
443 EXPECT_FALSE(interop_match_name(INTEROP_HFP_FAKE_INCOMING_CALL_INDICATOR, "TEST"));
444 EXPECT_FALSE(interop_match_name(INTEROP_HFP_SEND_CALL_INDICATORS_BACK_TO_BACK, "TEST"));
445 EXPECT_FALSE(interop_match_name(INTEROP_SETUP_SCO_WITH_NO_DELAY_AFTER_SLC_DURING_CALL, "TEST"));
446 EXPECT_FALSE(interop_match_name(INTEROP_ENABLE_PREFERRED_CONN_PARAMETER, "TEST"));
447 EXPECT_FALSE(interop_match_name(INTEROP_RETRY_SCO_AFTER_REMOTE_REJECT_SCO, "TEST"));
448 EXPECT_FALSE(interop_match_name(INTEROP_DELAY_SCO_FOR_MO_CALL, "TEST"));
449 EXPECT_FALSE(interop_match_name(INTEROP_CHANGE_HID_VID_PID, "TEST"));
450 EXPECT_FALSE(interop_match_name(INTEROP_HFP_1_8_DENYLIST, "TEST"));
451 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_ROLE_SWITCH_DURING_CONNECTION, "TEST"));
452 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_NAME_REQUEST, "TEST"));
453 EXPECT_FALSE(interop_match_name(INTEROP_AVRCP_1_4_ONLY, "TEST"));
454 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_SNIFF, "TEST"));
455 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_AVDTP_SUSPEND, "TEST"));
456 EXPECT_FALSE(interop_match_name(INTEROP_SLC_SKIP_BIND_COMMAND, "TEST"));
457 EXPECT_FALSE(interop_match_name(INTEROP_AVRCP_1_3_ONLY, "TEST"));
458
459 module_clean_up(&interop_module);
460 }
461
TEST_F(InteropTest,test_range_hit)462 TEST_F(InteropTest, test_range_hit) {
463 module_init(&interop_module);
464
465 RawAddress test_address;
466 RawAddress::FromString("00:0f:59:50:00:00", test_address);
467 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
468 RawAddress::FromString("00:0f:59:59:12:34", test_address);
469 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
470 RawAddress::FromString("00:0f:59:6f:ff:ff", test_address);
471 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
472
473 module_clean_up(&interop_module);
474 }
475
TEST_F(InteropTest,test_range_miss)476 TEST_F(InteropTest, test_range_miss) {
477 module_init(&interop_module);
478
479 RawAddress test_address;
480 RawAddress::FromString("00:0f:59:49:12:34", test_address);
481 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
482 RawAddress::FromString("00:0f:59:70:12:34", test_address);
483 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_ABSOLUTE_VOLUME, &test_address));
484
485 module_clean_up(&interop_module);
486 }
487
TEST_F(InteropTest,test_vndr_prdt_hit)488 TEST_F(InteropTest, test_vndr_prdt_hit) {
489 module_init(&interop_module);
490
491 uint16_t vendor_id = 0x22b8;
492 uint16_t product_id = 0x093D;
493
494 EXPECT_TRUE(interop_database_match_vndr_prdt(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, vendor_id,
495 product_id));
496
497 vendor_id = 0x05ac;
498 product_id = 0x0255;
499
500 EXPECT_TRUE(interop_database_match_vndr_prdt(INTEROP_CHANGE_HID_VID_PID, vendor_id, product_id));
501
502 module_clean_up(&interop_module);
503 }
504
TEST_F(InteropTest,test_vndr_prdt_miss)505 TEST_F(InteropTest, test_vndr_prdt_miss) {
506 module_init(&interop_module);
507
508 uint16_t vendor_id = 0x22b9;
509 uint16_t product_id = 0x093D;
510
511 EXPECT_FALSE(interop_database_match_vndr_prdt(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, vendor_id,
512 product_id));
513
514 module_clean_up(&interop_module);
515 }
516
TEST_F(InteropTest,test_manufacturer_hit)517 TEST_F(InteropTest, test_manufacturer_hit) {
518 module_init(&interop_module);
519
520 uint16_t manufacturer = 0x004C;
521
522 EXPECT_TRUE(interop_database_match_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer));
523
524 module_clean_up(&interop_module);
525 }
526
TEST_F(InteropTest,test_manufacturer_miss)527 TEST_F(InteropTest, test_manufacturer_miss) {
528 module_init(&interop_module);
529
530 uint16_t manufacturer = 0x004D;
531
532 EXPECT_FALSE(interop_database_match_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer));
533
534 module_clean_up(&interop_module);
535 }
536
TEST_F(InteropTest,test_ssr_max_latency_hit)537 TEST_F(InteropTest, test_ssr_max_latency_hit) {
538 module_init(&interop_module);
539
540 RawAddress test_address;
541 RawAddress::FromString("00:1b:dc:70:12:34", test_address);
542 uint16_t max_lat = 0;
543
544 EXPECT_TRUE(interop_database_match_addr_get_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT, &test_address,
545 &max_lat));
546 EXPECT_EQ(0x0012, max_lat);
547
548 module_clean_up(&interop_module);
549 }
550
TEST_F(InteropTest,test_ssr_max_latency_miss)551 TEST_F(InteropTest, test_ssr_max_latency_miss) {
552 module_init(&interop_module);
553
554 RawAddress test_address;
555 RawAddress::FromString("00:1b:db:70:12:34", test_address);
556 uint16_t max_lat = 0;
557
558 EXPECT_FALSE(interop_database_match_addr_get_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT,
559 &test_address, &max_lat));
560
561 module_clean_up(&interop_module);
562 }
563
TEST_F(InteropTest,test_dynamic_addr)564 TEST_F(InteropTest, test_dynamic_addr) {
565 module_init(&interop_module);
566
567 RawAddress test_address;
568
569 RawAddress::FromString("11:22:33:44:55:66", test_address);
570 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
571
572 interop_database_add_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address, 3);
573 EXPECT_TRUE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
574
575 interop_database_remove_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address);
576 EXPECT_FALSE(interop_match_addr(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, &test_address));
577
578 module_clean_up(&interop_module);
579 }
580
TEST_F(InteropTest,test_dynamic_name)581 TEST_F(InteropTest, test_dynamic_name) {
582 module_init(&interop_module);
583
584 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, "TEST"));
585
586 interop_database_add_name(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, "TEST");
587 EXPECT_TRUE(interop_match_name(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, "TEST"));
588
589 interop_database_remove_name(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, "TEST");
590 EXPECT_FALSE(interop_match_name(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, "TEST"));
591
592 module_clean_up(&interop_module);
593 }
594
TEST_F(InteropTest,test_dynamic_vndr_prdt)595 TEST_F(InteropTest, test_dynamic_vndr_prdt) {
596 module_init(&interop_module);
597
598 uint16_t vendor_id = 0x11b8;
599 uint16_t product_id = 0x193D;
600
601 EXPECT_FALSE(interop_database_match_vndr_prdt(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, vendor_id,
602 product_id));
603
604 interop_database_add_vndr_prdt(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, vendor_id, product_id);
605 EXPECT_TRUE(interop_database_match_vndr_prdt(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, vendor_id,
606 product_id));
607
608 interop_database_remove_vndr_prdt(INTEROP_REMOVE_HID_DIG_DESCRIPTOR, vendor_id, product_id);
609
610 EXPECT_FALSE(interop_database_match_vndr_prdt(INTEROP_CHANGE_HID_VID_PID, vendor_id, product_id));
611
612 module_clean_up(&interop_module);
613 }
614
TEST_F(InteropTest,test_dynamic_addr_get_ssr_max_lat)615 TEST_F(InteropTest, test_dynamic_addr_get_ssr_max_lat) {
616 module_init(&interop_module);
617
618 RawAddress test_address;
619 RawAddress::FromString("11:22:33:44:55:66", test_address);
620 uint16_t max_lat = 0;
621
622 EXPECT_FALSE(interop_database_match_addr_get_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT,
623 &test_address, &max_lat));
624 interop_database_add_addr_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT, &test_address, 0x0012);
625
626 interop_database_match_addr_get_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT, &test_address, &max_lat);
627 EXPECT_EQ(0x0012, max_lat);
628
629 interop_database_remove_addr_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT, &test_address, 0x0012);
630
631 max_lat = 0;
632 EXPECT_FALSE(interop_database_match_addr_get_max_lat(INTEROP_UPDATE_HID_SSR_MAX_LAT,
633 &test_address, &max_lat));
634
635 EXPECT_NE(0x0012, max_lat);
636
637 module_clean_up(&interop_module);
638 }
639
TEST_F(InteropTest,test_dynamic_manufacturer)640 TEST_F(InteropTest, test_dynamic_manufacturer) {
641 module_init(&interop_module);
642
643 uint16_t manufacturer = 0xFFFF;
644
645 EXPECT_FALSE(interop_database_match_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer));
646
647 interop_database_add_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer);
648
649 EXPECT_TRUE(interop_database_match_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer));
650
651 interop_database_remove_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer);
652
653 EXPECT_FALSE(interop_database_match_manufacturer(INTEROP_DISABLE_SNIFF_DURING_SCO, manufacturer));
654
655 module_clean_up(&interop_module);
656 }
657
TEST_F(InteropTest,test_dynamic_addr_get_lmp_version)658 TEST_F(InteropTest, test_dynamic_addr_get_lmp_version) {
659 module_init(&interop_module);
660
661 RawAddress test_address;
662 RawAddress::FromString("11:22:33:44:55:66", test_address);
663 uint8_t lmp_version = 0;
664 uint16_t lmp_sub_version = 0;
665
666 EXPECT_FALSE(interop_database_match_addr_get_lmp_ver(
667 INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address, &lmp_version, &lmp_sub_version));
668 interop_database_add_addr_lmp_version(INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address, 0xFF,
669 0xFFFF);
670
671 EXPECT_TRUE(interop_database_match_addr_get_lmp_ver(
672 INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address, &lmp_version, &lmp_sub_version));
673
674 EXPECT_TRUE(lmp_version == 0xFF && lmp_sub_version == 0xFFFF);
675
676 interop_database_remove_addr_lmp_version(INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address, 0xFF,
677 0xFFFF);
678
679 lmp_version = 0;
680 lmp_sub_version = 0;
681
682 EXPECT_FALSE(interop_database_match_addr_get_lmp_ver(
683 INTEROP_DISABLE_SNIFF_DURING_SCO, &test_address, &lmp_version, &lmp_sub_version));
684
685 EXPECT_FALSE(lmp_version == 0xFF && lmp_sub_version == 0xFFFF);
686
687 module_clean_up(&interop_module);
688 }
689
TEST_F(InteropTest,test_dynamic_did_version)690 TEST_F(InteropTest, test_dynamic_did_version) {
691 module_init(&interop_module);
692
693 RawAddress test_address;
694 RawAddress::FromString("11:22:33:44:55:66", test_address);
695 uint16_t did_version = 0xABCD;
696
697 EXPECT_FALSE(interop_database_match_version(INTEROP_DISABLE_SNIFF_DURING_SCO, did_version));
698 interop_database_add_version(INTEROP_DISABLE_SNIFF_DURING_SCO, did_version);
699
700 EXPECT_TRUE(interop_database_match_version(INTEROP_DISABLE_SNIFF_DURING_SCO, did_version));
701
702 interop_database_remove_version(INTEROP_DISABLE_SNIFF_DURING_SCO, did_version);
703
704 EXPECT_FALSE(interop_database_match_version(INTEROP_DISABLE_SNIFF_DURING_SCO, did_version));
705
706 module_clean_up(&interop_module);
707 }
708