blob: af90651ab12de10470d09a568cb18b78f7dc176f [file] [log] [blame]
Andre Eisenbach89ba5282016-10-13 15:45:02 -07001/*
2 * Copyright (C) 2016 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
17#define LOG_TAG "bluetooth_hidl_hal_test"
18#include <android-base/logging.h>
19
20#include <android/hardware/bluetooth/1.0/IBluetoothHci.h>
21#include <android/hardware/bluetooth/1.0/IBluetoothHciCallbacks.h>
22#include <android/hardware/bluetooth/1.0/types.h>
Andre Eisenbach89ba5282016-10-13 15:45:02 -070023#include <utils/Log.h>
24
Yuexi Ma51d023c2017-03-29 16:49:59 -070025#include <VtsHalHidlTargetCallbackBase.h>
Jakub Pawlowski13b4d312019-11-05 12:27:29 +010026#include <gtest/gtest.h>
27#include <hidl/GtestPrinter.h>
28#include <hidl/ServiceManagement.h>
Jack He88696322018-11-05 19:51:28 -080029
30#include <chrono>
Andre Eisenbach89ba5282016-10-13 15:45:02 -070031#include <queue>
Jack He88696322018-11-05 19:51:28 -080032#include <thread>
Andre Eisenbach89ba5282016-10-13 15:45:02 -070033
Jack Hecaeab052018-10-23 18:13:51 -070034using ::android::sp;
Jack Hefac144b2018-10-12 12:54:37 -070035using ::android::hardware::hidl_death_recipient;
Andre Eisenbach89ba5282016-10-13 15:45:02 -070036using ::android::hardware::hidl_vec;
37using ::android::hardware::Return;
38using ::android::hardware::Void;
Jack Hecaeab052018-10-23 18:13:51 -070039using ::android::hardware::bluetooth::V1_0::IBluetoothHci;
40using ::android::hardware::bluetooth::V1_0::IBluetoothHciCallbacks;
41using ::android::hardware::bluetooth::V1_0::Status;
Andre Eisenbach89ba5282016-10-13 15:45:02 -070042
Andre Eisenbach89ba5282016-10-13 15:45:02 -070043#define HCI_MINIMUM_HCI_VERSION 5 // Bluetooth Core Specification 3.0 + HS
44#define HCI_MINIMUM_LMP_VERSION 5 // Bluetooth Core Specification 3.0 + HS
45#define NUM_HCI_COMMANDS_BANDWIDTH 1000
46#define NUM_SCO_PACKETS_BANDWIDTH 1000
47#define NUM_ACL_PACKETS_BANDWIDTH 1000
Andre Eisenbach9041d972017-01-17 18:23:12 -080048#define WAIT_FOR_INIT_TIMEOUT std::chrono::milliseconds(2000)
Andre Eisenbach89ba5282016-10-13 15:45:02 -070049#define WAIT_FOR_HCI_EVENT_TIMEOUT std::chrono::milliseconds(2000)
50#define WAIT_FOR_SCO_DATA_TIMEOUT std::chrono::milliseconds(1000)
51#define WAIT_FOR_ACL_DATA_TIMEOUT std::chrono::milliseconds(1000)
More Kuo001c4bf2021-01-13 16:22:44 +080052#define INTERFACE_CLOSE_DELAY_MS std::chrono::milliseconds(600)
Andre Eisenbach89ba5282016-10-13 15:45:02 -070053
54#define COMMAND_HCI_SHOULD_BE_UNKNOWN \
55 { 0xff, 0x3B, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }
56#define COMMAND_HCI_READ_LOCAL_VERSION_INFORMATION \
57 { 0x01, 0x10, 0x00 }
58#define COMMAND_HCI_READ_BUFFER_SIZE \
59 { 0x05, 0x10, 0x00 }
60#define COMMAND_HCI_WRITE_LOOPBACK_MODE_LOCAL \
61 { 0x02, 0x18, 0x01, 0x01 }
62#define COMMAND_HCI_RESET \
63 { 0x03, 0x0c, 0x00 }
64#define COMMAND_HCI_WRITE_LOCAL_NAME \
65 { 0x13, 0x0c, 0xf8 }
66#define HCI_STATUS_SUCCESS 0x00
67#define HCI_STATUS_UNKNOWN_HCI_COMMAND 0x01
68
69#define EVENT_CONNECTION_COMPLETE 0x03
70#define EVENT_COMMAND_COMPLETE 0x0e
71#define EVENT_COMMAND_STATUS 0x0f
72#define EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13
73#define EVENT_LOOPBACK_COMMAND 0x19
74
75#define EVENT_CODE_BYTE 0
76#define EVENT_LENGTH_BYTE 1
77#define EVENT_FIRST_PAYLOAD_BYTE 2
78#define EVENT_COMMAND_STATUS_STATUS_BYTE 2
79#define EVENT_COMMAND_STATUS_ALLOWED_PACKETS_BYTE 3
80#define EVENT_COMMAND_STATUS_OPCODE_LSBYTE 4 // Bytes 4 and 5
81#define EVENT_COMMAND_COMPLETE_ALLOWED_PACKETS_BYTE 2
82#define EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE 3 // Bytes 3 and 4
83#define EVENT_COMMAND_COMPLETE_STATUS_BYTE 5
84#define EVENT_COMMAND_COMPLETE_FIRST_PARAM_BYTE 6
85#define EVENT_LOCAL_HCI_VERSION_BYTE EVENT_COMMAND_COMPLETE_FIRST_PARAM_BYTE
86#define EVENT_LOCAL_LMP_VERSION_BYTE EVENT_LOCAL_HCI_VERSION_BYTE + 3
87
88#define EVENT_CONNECTION_COMPLETE_PARAM_LENGTH 11
89#define EVENT_CONNECTION_COMPLETE_TYPE 11
90#define EVENT_CONNECTION_COMPLETE_TYPE_SCO 0
91#define EVENT_CONNECTION_COMPLETE_TYPE_ACL 1
92#define EVENT_CONNECTION_COMPLETE_HANDLE_LSBYTE 3
93#define EVENT_COMMAND_STATUS_LENGTH 4
94
95#define EVENT_NUMBER_OF_COMPLETED_PACKETS_NUM_HANDLES 2
96
Stanley Tng7915b712017-07-19 10:55:01 -070097#define ACL_BROADCAST_FLAG_OFFSET 6
Myles Watson72382e32017-11-28 17:38:29 -080098#define ACL_BROADCAST_FLAG_POINT_TO_POINT 0x0
99#define ACL_BROADCAST_POINT_TO_POINT \
100 (ACL_BROADCAST_FLAG_POINT_TO_POINT << ACL_BROADCAST_FLAG_OFFSET)
Stanley Tng7915b712017-07-19 10:55:01 -0700101
102#define ACL_PACKET_BOUNDARY_FLAG_OFFSET 4
Myles Watson72382e32017-11-28 17:38:29 -0800103#define ACL_PACKET_BOUNDARY_FLAG_FIRST_AUTO_FLUSHABLE 0x2
104#define ACL_PACKET_BOUNDARY_FIRST_AUTO_FLUSHABLE \
105 (ACL_PACKET_BOUNDARY_FLAG_FIRST_AUTO_FLUSHABLE \
106 << ACL_PACKET_BOUNDARY_FLAG_OFFSET)
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700107
Jack He5ab36772018-11-05 19:58:15 -0800108// To be removed in VTS release builds
109#define ACL_HANDLE_QCA_DEBUG_MESSAGE 0xedc
110
Yuexi Ma51d023c2017-03-29 16:49:59 -0700111constexpr char kCallbackNameAclEventReceived[] = "aclDataReceived";
112constexpr char kCallbackNameHciEventReceived[] = "hciEventReceived";
113constexpr char kCallbackNameInitializationComplete[] = "initializationComplete";
114constexpr char kCallbackNameScoEventReceived[] = "scoDataReceived";
115
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700116class ThroughputLogger {
117 public:
118 ThroughputLogger(std::string task)
119 : task_(task), start_time_(std::chrono::steady_clock::now()) {}
120
121 ~ThroughputLogger() {
122 if (total_bytes_ == 0) return;
123 std::chrono::duration<double> duration =
124 std::chrono::steady_clock::now() - start_time_;
125 double s = duration.count();
126 if (s == 0) return;
127 double rate_kb = (static_cast<double>(total_bytes_) / s) / 1024;
128 ALOGD("%s %.1f KB/s (%zu bytes in %.3fs)", task_.c_str(), rate_kb,
129 total_bytes_, s);
130 }
131
132 void setTotalBytes(size_t total_bytes) { total_bytes_ = total_bytes; }
133
134 private:
135 size_t total_bytes_;
136 std::string task_;
137 std::chrono::steady_clock::time_point start_time_;
138};
139
140// The main test class for Bluetooth HIDL HAL.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100141class BluetoothHidlTest : public ::testing::TestWithParam<std::string> {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700142 public:
143 virtual void SetUp() override {
144 // currently test passthrough mode only
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100145 bluetooth = IBluetoothHci::getService(GetParam());
Myles Watsondbbdf3e2017-02-13 10:57:47 -0800146 ASSERT_NE(bluetooth, nullptr);
Myles Watsonbc7e5872017-02-17 09:14:21 -0800147 ALOGI("%s: getService() for bluetooth is %s", __func__,
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700148 bluetooth->isRemote() ? "remote" : "local");
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700149
Jack Hefac144b2018-10-12 12:54:37 -0700150 bluetooth_hci_death_recipient = new BluetoothHciDeathRecipient();
151 ASSERT_NE(bluetooth_hci_death_recipient, nullptr);
152 ASSERT_TRUE(
153 bluetooth->linkToDeath(bluetooth_hci_death_recipient, 0).isOk());
154
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700155 bluetooth_cb = new BluetoothHciCallbacks(*this);
156 ASSERT_NE(bluetooth_cb, nullptr);
157
158 max_acl_data_packet_length = 0;
159 max_sco_data_packet_length = 0;
160 max_acl_data_packets = 0;
161 max_sco_data_packets = 0;
162
Andre Eisenbach9041d972017-01-17 18:23:12 -0800163 initialized = false;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700164 event_cb_count = 0;
165 acl_cb_count = 0;
166 sco_cb_count = 0;
167
Jack He4b50fcd2018-10-04 18:42:37 -0700168 ASSERT_FALSE(initialized);
169 // Should not be checked in production code
170 ASSERT_TRUE(bluetooth->initialize(bluetooth_cb).isOk());
Andre Eisenbach9041d972017-01-17 18:23:12 -0800171
Yuexi Ma51d023c2017-03-29 16:49:59 -0700172 bluetooth_cb->SetWaitTimeout(kCallbackNameInitializationComplete,
173 WAIT_FOR_INIT_TIMEOUT);
174 bluetooth_cb->SetWaitTimeout(kCallbackNameHciEventReceived,
175 WAIT_FOR_HCI_EVENT_TIMEOUT);
176 bluetooth_cb->SetWaitTimeout(kCallbackNameAclEventReceived,
177 WAIT_FOR_ACL_DATA_TIMEOUT);
178 bluetooth_cb->SetWaitTimeout(kCallbackNameScoEventReceived,
179 WAIT_FOR_SCO_DATA_TIMEOUT);
180
Myles Watson244ad362021-04-01 17:26:43 +0000181 ASSERT_TRUE(
Yuexi Ma51d023c2017-03-29 16:49:59 -0700182 bluetooth_cb->WaitForCallback(kCallbackNameInitializationComplete)
Yuexi Mab8012eb2017-03-31 16:26:18 -0700183 .no_timeout);
Andre Eisenbach9041d972017-01-17 18:23:12 -0800184
Jack He4b50fcd2018-10-04 18:42:37 -0700185 ASSERT_TRUE(initialized);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700186 }
187
188 virtual void TearDown() override {
Jack He88696322018-11-05 19:51:28 -0800189 ALOGI("TearDown");
Jack Hecaeab052018-10-23 18:13:51 -0700190 // Should not be checked in production code
191 ASSERT_TRUE(bluetooth->close().isOk());
Jack He88696322018-11-05 19:51:28 -0800192 std::this_thread::sleep_for(INTERFACE_CLOSE_DELAY_MS);
Jack Hecaeab052018-10-23 18:13:51 -0700193 handle_no_ops();
194 EXPECT_EQ(static_cast<size_t>(0), event_queue.size());
195 EXPECT_EQ(static_cast<size_t>(0), sco_queue.size());
196 EXPECT_EQ(static_cast<size_t>(0), acl_queue.size());
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700197 }
198
199 void setBufferSizes();
200
201 // Functions called from within tests in loopback mode
202 void sendAndCheckHCI(int num_packets);
203 void sendAndCheckSCO(int num_packets, size_t size, uint16_t handle);
204 void sendAndCheckACL(int num_packets, size_t size, uint16_t handle);
205
206 // Helper functions to try to get a handle on verbosity
207 void enterLoopbackMode(std::vector<uint16_t>& sco_handles,
208 std::vector<uint16_t>& acl_handles);
Myles Watson72382e32017-11-28 17:38:29 -0800209 void handle_no_ops();
210 void wait_for_event(bool timeout_is_error);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700211 void wait_for_command_complete_event(hidl_vec<uint8_t> cmd);
212 int wait_for_completed_packets_event(uint16_t handle);
213
Jack Hefac144b2018-10-12 12:54:37 -0700214 class BluetoothHciDeathRecipient : public hidl_death_recipient {
215 public:
Jack He88696322018-11-05 19:51:28 -0800216 void serviceDied(
Jack Hefac144b2018-10-12 12:54:37 -0700217 uint64_t /*cookie*/,
Jack He88696322018-11-05 19:51:28 -0800218 const android::wp<::android::hidl::base::V1_0::IBase>& /*who*/)
219 override {
Jack Hefac144b2018-10-12 12:54:37 -0700220 FAIL();
221 }
222 };
223
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700224 // A simple test implementation of BluetoothHciCallbacks.
Yuexi Ma51d023c2017-03-29 16:49:59 -0700225 class BluetoothHciCallbacks
226 : public ::testing::VtsHalHidlTargetCallbackBase<BluetoothHidlTest>,
227 public IBluetoothHciCallbacks {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700228 BluetoothHidlTest& parent_;
229
230 public:
231 BluetoothHciCallbacks(BluetoothHidlTest& parent) : parent_(parent){};
232
233 virtual ~BluetoothHciCallbacks() = default;
234
Andre Eisenbach9041d972017-01-17 18:23:12 -0800235 Return<void> initializationComplete(Status status) override {
Myles Watsonbc7e5872017-02-17 09:14:21 -0800236 parent_.initialized = (status == Status::SUCCESS);
Yuexi Ma51d023c2017-03-29 16:49:59 -0700237 NotifyFromCallback(kCallbackNameInitializationComplete);
Andre Eisenbach9041d972017-01-17 18:23:12 -0800238 ALOGV("%s (status = %d)", __func__, static_cast<int>(status));
239 return Void();
240 };
241
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700242 Return<void> hciEventReceived(
243 const ::android::hardware::hidl_vec<uint8_t>& event) override {
244 parent_.event_cb_count++;
245 parent_.event_queue.push(event);
Yuexi Ma51d023c2017-03-29 16:49:59 -0700246 NotifyFromCallback(kCallbackNameHciEventReceived);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700247 ALOGV("Event received (length = %d)", static_cast<int>(event.size()));
248 return Void();
249 };
250
251 Return<void> aclDataReceived(
252 const ::android::hardware::hidl_vec<uint8_t>& data) override {
253 parent_.acl_cb_count++;
254 parent_.acl_queue.push(data);
Yuexi Ma51d023c2017-03-29 16:49:59 -0700255 NotifyFromCallback(kCallbackNameAclEventReceived);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700256 return Void();
257 };
258
259 Return<void> scoDataReceived(
260 const ::android::hardware::hidl_vec<uint8_t>& data) override {
261 parent_.sco_cb_count++;
262 parent_.sco_queue.push(data);
Yuexi Ma51d023c2017-03-29 16:49:59 -0700263 NotifyFromCallback(kCallbackNameScoEventReceived);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700264 return Void();
265 };
266 };
267
268 sp<IBluetoothHci> bluetooth;
Yuexi Ma51d023c2017-03-29 16:49:59 -0700269 sp<BluetoothHciCallbacks> bluetooth_cb;
Jack Hefac144b2018-10-12 12:54:37 -0700270 sp<BluetoothHciDeathRecipient> bluetooth_hci_death_recipient;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700271 std::queue<hidl_vec<uint8_t>> event_queue;
272 std::queue<hidl_vec<uint8_t>> acl_queue;
273 std::queue<hidl_vec<uint8_t>> sco_queue;
274
Andre Eisenbach9041d972017-01-17 18:23:12 -0800275 bool initialized;
276
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700277 int event_cb_count;
278 int sco_cb_count;
279 int acl_cb_count;
280
281 int max_acl_data_packet_length;
282 int max_sco_data_packet_length;
283 int max_acl_data_packets;
284 int max_sco_data_packets;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700285};
286
Myles Watson72382e32017-11-28 17:38:29 -0800287// Discard NO-OPs from the event queue.
288void BluetoothHidlTest::handle_no_ops() {
289 while (event_queue.size() > 0) {
290 hidl_vec<uint8_t> event = event_queue.front();
Myles Watson244ad362021-04-01 17:26:43 +0000291 ASSERT_GE(event.size(),
Myles Watson72382e32017-11-28 17:38:29 -0800292 static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE));
293 bool event_is_no_op =
294 (event[EVENT_CODE_BYTE] == EVENT_COMMAND_COMPLETE) &&
295 (event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE] == 0x00) &&
296 (event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1] == 0x00);
297 event_is_no_op |= (event[EVENT_CODE_BYTE] == EVENT_COMMAND_STATUS) &&
298 (event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE] == 0x00) &&
299 (event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE + 1] == 0x00);
300 if (event_is_no_op) {
301 event_queue.pop();
302 } else {
Jack He88696322018-11-05 19:51:28 -0800303 break;
Myles Watson72382e32017-11-28 17:38:29 -0800304 }
305 }
Jack He5ab36772018-11-05 19:58:15 -0800306 // To be removed in VTS release builds
307 while (acl_queue.size() > 0) {
308 hidl_vec<uint8_t> acl_packet = acl_queue.front();
309 uint16_t connection_handle = acl_packet[1] & 0xF;
310 connection_handle <<= 8;
311 connection_handle |= acl_packet[0];
312 bool packet_is_no_op = connection_handle == ACL_HANDLE_QCA_DEBUG_MESSAGE;
313 if (packet_is_no_op) {
314 acl_queue.pop();
315 } else {
316 break;
317 }
318 }
Myles Watson72382e32017-11-28 17:38:29 -0800319}
320
321// Receive an event, discarding NO-OPs.
322void BluetoothHidlTest::wait_for_event(bool timeout_is_error = true) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700323 hidl_vec<uint8_t> event;
324 do {
Myles Watson72382e32017-11-28 17:38:29 -0800325 bool no_timeout =
326 bluetooth_cb->WaitForCallback(kCallbackNameHciEventReceived).no_timeout;
327 EXPECT_TRUE(no_timeout || !timeout_is_error);
328 if (no_timeout && timeout_is_error) {
Myles Watson244ad362021-04-01 17:26:43 +0000329 ASSERT_LT(static_cast<size_t>(0), event_queue.size());
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700330 }
Myles Watson72382e32017-11-28 17:38:29 -0800331 if (event_queue.size() == 0) {
332 // WaitForCallback timed out.
333 return;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700334 }
Myles Watson72382e32017-11-28 17:38:29 -0800335 handle_no_ops();
336 } while (event_queue.size() == 0);
337}
338
339// Wait until a COMMAND_COMPLETE is received.
340void BluetoothHidlTest::wait_for_command_complete_event(hidl_vec<uint8_t> cmd) {
341 wait_for_event();
342 hidl_vec<uint8_t> event = event_queue.front();
343 event_queue.pop();
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700344
Myles Watson244ad362021-04-01 17:26:43 +0000345 ASSERT_GT(event.size(),
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700346 static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE));
Myles Watson244ad362021-04-01 17:26:43 +0000347 ASSERT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]);
348 ASSERT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]);
349 ASSERT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]);
350 ASSERT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700351}
352
353// Send the command to read the controller's buffer sizes.
354void BluetoothHidlTest::setBufferSizes() {
355 hidl_vec<uint8_t> cmd = COMMAND_HCI_READ_BUFFER_SIZE;
356 bluetooth->sendHciCommand(cmd);
357
Myles Watson72382e32017-11-28 17:38:29 -0800358 wait_for_event();
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700359 if (event_queue.size() == 0) return;
360
361 hidl_vec<uint8_t> event = event_queue.front();
362 event_queue.pop();
363
Myles Watson244ad362021-04-01 17:26:43 +0000364 ASSERT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]);
365 ASSERT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]);
366 ASSERT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]);
367 ASSERT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700368
369 max_acl_data_packet_length =
370 event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 1] +
371 (event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 2] << 8);
372 max_sco_data_packet_length = event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 3];
373 max_acl_data_packets = event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 4] +
374 (event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 5] << 8);
375 max_sco_data_packets = event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 6] +
376 (event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 7] << 8);
377
378 ALOGD("%s: ACL max %d num %d SCO max %d num %d", __func__,
379 static_cast<int>(max_acl_data_packet_length),
380 static_cast<int>(max_acl_data_packets),
381 static_cast<int>(max_sco_data_packet_length),
382 static_cast<int>(max_sco_data_packets));
383}
384
385// Send an HCI command (in Loopback mode) and check the response.
386void BluetoothHidlTest::sendAndCheckHCI(int num_packets) {
387 ThroughputLogger logger = {__func__};
Myles Watson72382e32017-11-28 17:38:29 -0800388 int command_size = 0;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700389 for (int n = 0; n < num_packets; n++) {
390 // Send an HCI packet
391 std::vector<uint8_t> write_name = COMMAND_HCI_WRITE_LOCAL_NAME;
392 // With a name
393 char new_name[] = "John Jacob Jingleheimer Schmidt ___________________0";
394 size_t new_name_length = strlen(new_name);
395 for (size_t i = 0; i < new_name_length; i++)
396 write_name.push_back(static_cast<uint8_t>(new_name[i]));
397 // And the packet number
Myles Watson72382e32017-11-28 17:38:29 -0800398 size_t i = new_name_length - 1;
399 for (int digits = n; digits > 0; digits = digits / 10, i--)
400 write_name[i] = static_cast<uint8_t>('0' + digits % 10);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700401 // And padding
402 for (size_t i = 0; i < 248 - new_name_length; i++)
403 write_name.push_back(static_cast<uint8_t>(0));
404
405 hidl_vec<uint8_t> cmd = write_name;
406 bluetooth->sendHciCommand(cmd);
407
408 // Check the loopback of the HCI packet
Myles Watson72382e32017-11-28 17:38:29 -0800409 wait_for_event();
410 if (event_queue.size() == 0) return;
411
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700412 hidl_vec<uint8_t> event = event_queue.front();
413 event_queue.pop();
414 size_t compare_length =
415 (cmd.size() > static_cast<size_t>(0xff) ? static_cast<size_t>(0xff)
416 : cmd.size());
Myles Watson244ad362021-04-01 17:26:43 +0000417 ASSERT_GT(event.size(), compare_length + EVENT_FIRST_PAYLOAD_BYTE - 1);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700418
Myles Watson244ad362021-04-01 17:26:43 +0000419 ASSERT_EQ(EVENT_LOOPBACK_COMMAND, event[EVENT_CODE_BYTE]);
420 ASSERT_EQ(compare_length, event[EVENT_LENGTH_BYTE]);
Myles Watson72382e32017-11-28 17:38:29 -0800421
422 // Don't compare past the end of the event.
423 if (compare_length + EVENT_FIRST_PAYLOAD_BYTE > event.size()) {
424 compare_length = event.size() - EVENT_FIRST_PAYLOAD_BYTE;
425 ALOGE("Only comparing %d bytes", static_cast<int>(compare_length));
426 }
427
428 if (n == num_packets - 1) {
429 command_size = cmd.size();
430 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700431
432 for (size_t i = 0; i < compare_length; i++)
433 EXPECT_EQ(cmd[i], event[EVENT_FIRST_PAYLOAD_BYTE + i]);
434 }
Myles Watson72382e32017-11-28 17:38:29 -0800435 logger.setTotalBytes(command_size * num_packets * 2);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700436}
437
438// Send a SCO data packet (in Loopback mode) and check the response.
439void BluetoothHidlTest::sendAndCheckSCO(int num_packets, size_t size,
440 uint16_t handle) {
441 ThroughputLogger logger = {__func__};
442 for (int n = 0; n < num_packets; n++) {
443 // Send a SCO packet
444 hidl_vec<uint8_t> sco_packet;
445 std::vector<uint8_t> sco_vector;
446 sco_vector.push_back(static_cast<uint8_t>(handle & 0xff));
447 sco_vector.push_back(static_cast<uint8_t>((handle & 0x0f00) >> 8));
448 sco_vector.push_back(static_cast<uint8_t>(size & 0xff));
449 sco_vector.push_back(static_cast<uint8_t>((size & 0xff00) >> 8));
450 for (size_t i = 0; i < size; i++) {
451 sco_vector.push_back(static_cast<uint8_t>(i + n));
452 }
453 sco_packet = sco_vector;
454 bluetooth->sendScoData(sco_vector);
455
456 // Check the loopback of the SCO packet
Myles Watson244ad362021-04-01 17:26:43 +0000457 ASSERT_TRUE(bluetooth_cb->WaitForCallback(kCallbackNameScoEventReceived)
Yuexi Mab8012eb2017-03-31 16:26:18 -0700458 .no_timeout);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700459 hidl_vec<uint8_t> sco_loopback = sco_queue.front();
460 sco_queue.pop();
461
Myles Watson244ad362021-04-01 17:26:43 +0000462 ASSERT_EQ(sco_packet.size(), sco_loopback.size());
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700463 size_t successful_bytes = 0;
464
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700465 for (size_t i = 0; i < sco_packet.size(); i++) {
466 if (sco_packet[i] == sco_loopback[i]) {
467 successful_bytes = i;
468 } else {
469 ALOGE("Miscompare at %d (expected %x, got %x)", static_cast<int>(i),
470 sco_packet[i], sco_loopback[i]);
471 ALOGE("At %d (expected %x, got %x)", static_cast<int>(i + 1),
472 sco_packet[i + 1], sco_loopback[i + 1]);
473 break;
474 }
475 }
Myles Watson244ad362021-04-01 17:26:43 +0000476 ASSERT_EQ(sco_packet.size(), successful_bytes + 1);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700477 }
Myles Watson72382e32017-11-28 17:38:29 -0800478 logger.setTotalBytes(num_packets * size * 2);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700479}
480
481// Send an ACL data packet (in Loopback mode) and check the response.
482void BluetoothHidlTest::sendAndCheckACL(int num_packets, size_t size,
483 uint16_t handle) {
484 ThroughputLogger logger = {__func__};
485 for (int n = 0; n < num_packets; n++) {
486 // Send an ACL packet
487 hidl_vec<uint8_t> acl_packet;
488 std::vector<uint8_t> acl_vector;
489 acl_vector.push_back(static_cast<uint8_t>(handle & 0xff));
490 acl_vector.push_back(static_cast<uint8_t>((handle & 0x0f00) >> 8) |
Myles Watson72382e32017-11-28 17:38:29 -0800491 ACL_BROADCAST_POINT_TO_POINT |
492 ACL_PACKET_BOUNDARY_FIRST_AUTO_FLUSHABLE);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700493 acl_vector.push_back(static_cast<uint8_t>(size & 0xff));
494 acl_vector.push_back(static_cast<uint8_t>((size & 0xff00) >> 8));
495 for (size_t i = 0; i < size; i++) {
496 acl_vector.push_back(static_cast<uint8_t>(i + n));
497 }
498 acl_packet = acl_vector;
499 bluetooth->sendAclData(acl_vector);
500
501 // Check the loopback of the ACL packet
Myles Watson244ad362021-04-01 17:26:43 +0000502 ASSERT_TRUE(bluetooth_cb->WaitForCallback(kCallbackNameAclEventReceived)
Yuexi Mab8012eb2017-03-31 16:26:18 -0700503 .no_timeout);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700504 hidl_vec<uint8_t> acl_loopback = acl_queue.front();
505 acl_queue.pop();
506
507 EXPECT_EQ(acl_packet.size(), acl_loopback.size());
Myles Watson244ad362021-04-01 17:26:43 +0000508 for (size_t i = 0; i < acl_packet.size() && i < acl_loopback.size(); i++) {
509 EXPECT_EQ(acl_packet[i], acl_loopback[i]) << " at byte number " << i;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700510 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700511 }
Myles Watson72382e32017-11-28 17:38:29 -0800512 logger.setTotalBytes(num_packets * size * 2);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700513}
514
515// Return the number of completed packets reported by the controller.
516int BluetoothHidlTest::wait_for_completed_packets_event(uint16_t handle) {
Myles Watson72382e32017-11-28 17:38:29 -0800517 int packets_processed = 0;
Myles Watsona794f832023-03-02 13:45:07 -0800518 while (true) {
519 // There should be at least one event.
520 wait_for_event(packets_processed == 0);
521 if (event_queue.empty()) {
522 if (packets_processed == 0) {
523 ALOGW("%s: WaitForCallback timed out.", __func__);
524 }
525 return packets_processed;
526 }
Myles Watson72382e32017-11-28 17:38:29 -0800527 hidl_vec<uint8_t> event = event_queue.front();
528 event_queue.pop();
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700529
Myles Watson72382e32017-11-28 17:38:29 -0800530 EXPECT_EQ(EVENT_NUMBER_OF_COMPLETED_PACKETS, event[EVENT_CODE_BYTE]);
531 EXPECT_EQ(1, event[EVENT_NUMBER_OF_COMPLETED_PACKETS_NUM_HANDLES]);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700532
Myles Watson72382e32017-11-28 17:38:29 -0800533 uint16_t event_handle = event[3] + (event[4] << 8);
534 EXPECT_EQ(handle, event_handle);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700535
Myles Watson72382e32017-11-28 17:38:29 -0800536 packets_processed += event[5] + (event[6] << 8);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700537 }
538 return packets_processed;
539}
540
541// Send local loopback command and initialize SCO and ACL handles.
542void BluetoothHidlTest::enterLoopbackMode(std::vector<uint16_t>& sco_handles,
543 std::vector<uint16_t>& acl_handles) {
544 hidl_vec<uint8_t> cmd = COMMAND_HCI_WRITE_LOOPBACK_MODE_LOCAL;
545 bluetooth->sendHciCommand(cmd);
546
547 // Receive connection complete events with data channels
548 int connection_event_count = 0;
Myles Watson72382e32017-11-28 17:38:29 -0800549 bool command_complete_received = false;
550 while (true) {
551 wait_for_event(false);
552 if (event_queue.size() == 0) {
553 // Fail if there was no event received or no connections completed.
Myles Watson244ad362021-04-01 17:26:43 +0000554 ASSERT_TRUE(command_complete_received);
555 ASSERT_LT(0, connection_event_count);
Myles Watson72382e32017-11-28 17:38:29 -0800556 return;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700557 }
Myles Watson72382e32017-11-28 17:38:29 -0800558 hidl_vec<uint8_t> event = event_queue.front();
559 event_queue.pop();
Myles Watson244ad362021-04-01 17:26:43 +0000560 ASSERT_GT(event.size(),
Myles Watson72382e32017-11-28 17:38:29 -0800561 static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE));
562 if (event[EVENT_CODE_BYTE] == EVENT_CONNECTION_COMPLETE) {
Myles Watson244ad362021-04-01 17:26:43 +0000563 ASSERT_GT(event.size(),
Myles Watson72382e32017-11-28 17:38:29 -0800564 static_cast<size_t>(EVENT_CONNECTION_COMPLETE_TYPE));
Myles Watson244ad362021-04-01 17:26:43 +0000565 ASSERT_EQ(event[EVENT_LENGTH_BYTE],
Myles Watson72382e32017-11-28 17:38:29 -0800566 EVENT_CONNECTION_COMPLETE_PARAM_LENGTH);
567 uint8_t connection_type = event[EVENT_CONNECTION_COMPLETE_TYPE];
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700568
Myles Watson244ad362021-04-01 17:26:43 +0000569 ASSERT_TRUE(connection_type == EVENT_CONNECTION_COMPLETE_TYPE_SCO ||
Myles Watson72382e32017-11-28 17:38:29 -0800570 connection_type == EVENT_CONNECTION_COMPLETE_TYPE_ACL);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700571
Myles Watson72382e32017-11-28 17:38:29 -0800572 // Save handles
573 uint16_t handle = event[EVENT_CONNECTION_COMPLETE_HANDLE_LSBYTE] |
574 event[EVENT_CONNECTION_COMPLETE_HANDLE_LSBYTE + 1] << 8;
575 if (connection_type == EVENT_CONNECTION_COMPLETE_TYPE_SCO)
576 sco_handles.push_back(handle);
577 else
578 acl_handles.push_back(handle);
579
580 ALOGD("Connect complete type = %d handle = %d",
581 event[EVENT_CONNECTION_COMPLETE_TYPE], handle);
582 connection_event_count++;
583 } else {
Myles Watson244ad362021-04-01 17:26:43 +0000584 ASSERT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]);
585 ASSERT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]);
586 ASSERT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]);
587 ASSERT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]);
Myles Watson72382e32017-11-28 17:38:29 -0800588 command_complete_received = true;
589 }
590 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700591}
592
593// Empty test: Initialize()/Close() are called in SetUp()/TearDown().
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100594TEST_P(BluetoothHidlTest, InitializeAndClose) {}
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700595
596// Send an HCI Reset with sendHciCommand and wait for a command complete event.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100597TEST_P(BluetoothHidlTest, HciReset) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700598 hidl_vec<uint8_t> cmd = COMMAND_HCI_RESET;
599 bluetooth->sendHciCommand(cmd);
600
601 wait_for_command_complete_event(cmd);
602}
603
604// Read and check the HCI version of the controller.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100605TEST_P(BluetoothHidlTest, HciVersionTest) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700606 hidl_vec<uint8_t> cmd = COMMAND_HCI_READ_LOCAL_VERSION_INFORMATION;
607 bluetooth->sendHciCommand(cmd);
608
Myles Watson72382e32017-11-28 17:38:29 -0800609 wait_for_event();
610 if (event_queue.size() == 0) return;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700611
612 hidl_vec<uint8_t> event = event_queue.front();
613 event_queue.pop();
Myles Watson244ad362021-04-01 17:26:43 +0000614 ASSERT_GT(event.size(), static_cast<size_t>(EVENT_LOCAL_LMP_VERSION_BYTE));
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700615
Myles Watson244ad362021-04-01 17:26:43 +0000616 ASSERT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]);
617 ASSERT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]);
618 ASSERT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]);
619 ASSERT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700620
Myles Watson244ad362021-04-01 17:26:43 +0000621 ASSERT_LE(HCI_MINIMUM_HCI_VERSION, event[EVENT_LOCAL_HCI_VERSION_BYTE]);
622 ASSERT_LE(HCI_MINIMUM_LMP_VERSION, event[EVENT_LOCAL_LMP_VERSION_BYTE]);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700623}
624
625// Send an unknown HCI command and wait for the error message.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100626TEST_P(BluetoothHidlTest, HciUnknownCommand) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700627 hidl_vec<uint8_t> cmd = COMMAND_HCI_SHOULD_BE_UNKNOWN;
628 bluetooth->sendHciCommand(cmd);
629
Myles Watson72382e32017-11-28 17:38:29 -0800630 wait_for_event();
631 if (event_queue.size() == 0) return;
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700632
633 hidl_vec<uint8_t> event = event_queue.front();
634 event_queue.pop();
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700635
Myles Watson244ad362021-04-01 17:26:43 +0000636 ASSERT_GT(event.size(),
Myles Watson72382e32017-11-28 17:38:29 -0800637 static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE));
638 if (event[EVENT_CODE_BYTE] == EVENT_COMMAND_COMPLETE) {
Myles Watson244ad362021-04-01 17:26:43 +0000639 ASSERT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]);
640 ASSERT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]);
641 ASSERT_EQ(HCI_STATUS_UNKNOWN_HCI_COMMAND,
Myles Watson72382e32017-11-28 17:38:29 -0800642 event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]);
643 } else {
Myles Watson244ad362021-04-01 17:26:43 +0000644 ASSERT_EQ(EVENT_COMMAND_STATUS, event[EVENT_CODE_BYTE]);
645 ASSERT_EQ(cmd[0], event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE]);
646 ASSERT_EQ(cmd[1], event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE + 1]);
647 ASSERT_EQ(HCI_STATUS_UNKNOWN_HCI_COMMAND,
Myles Watson72382e32017-11-28 17:38:29 -0800648 event[EVENT_COMMAND_STATUS_STATUS_BYTE]);
649 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700650}
651
652// Enter loopback mode, but don't send any packets.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100653TEST_P(BluetoothHidlTest, WriteLoopbackMode) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700654 std::vector<uint16_t> sco_connection_handles;
655 std::vector<uint16_t> acl_connection_handles;
656 enterLoopbackMode(sco_connection_handles, acl_connection_handles);
657}
658
659// Enter loopback mode and send single packets.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100660TEST_P(BluetoothHidlTest, LoopbackModeSinglePackets) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700661 setBufferSizes();
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700662
663 std::vector<uint16_t> sco_connection_handles;
664 std::vector<uint16_t> acl_connection_handles;
665 enterLoopbackMode(sco_connection_handles, acl_connection_handles);
666
667 sendAndCheckHCI(1);
668
669 // This should work, but breaks on some current platforms. Figure out how to
670 // grandfather older devices but test new ones.
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700671 if (0 && sco_connection_handles.size() > 0) {
Myles Watson244ad362021-04-01 17:26:43 +0000672 ASSERT_LT(0, max_sco_data_packet_length);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700673 sendAndCheckSCO(1, max_sco_data_packet_length, sco_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700674 int sco_packets_sent = 1;
Jack Hecaeab052018-10-23 18:13:51 -0700675 int completed_packets =
676 wait_for_completed_packets_event(sco_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700677 if (sco_packets_sent != completed_packets) {
Jack Hecaeab052018-10-23 18:13:51 -0700678 ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__,
679 sco_packets_sent, completed_packets);
Myles Watson0e06a632017-09-06 16:26:49 -0700680 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700681 }
682
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700683 if (acl_connection_handles.size() > 0) {
Myles Watson244ad362021-04-01 17:26:43 +0000684 ASSERT_LT(0, max_acl_data_packet_length);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700685 sendAndCheckACL(1, max_acl_data_packet_length, acl_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700686 int acl_packets_sent = 1;
Jack Hecaeab052018-10-23 18:13:51 -0700687 int completed_packets =
688 wait_for_completed_packets_event(acl_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700689 if (acl_packets_sent != completed_packets) {
Jack Hecaeab052018-10-23 18:13:51 -0700690 ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__,
691 acl_packets_sent, completed_packets);
Myles Watson0e06a632017-09-06 16:26:49 -0700692 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700693 }
694}
695
696// Enter loopback mode and send packets for bandwidth measurements.
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100697TEST_P(BluetoothHidlTest, LoopbackModeBandwidth) {
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700698 setBufferSizes();
699
700 std::vector<uint16_t> sco_connection_handles;
701 std::vector<uint16_t> acl_connection_handles;
702 enterLoopbackMode(sco_connection_handles, acl_connection_handles);
703
704 sendAndCheckHCI(NUM_HCI_COMMANDS_BANDWIDTH);
705
706 // This should work, but breaks on some current platforms. Figure out how to
707 // grandfather older devices but test new ones.
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700708 if (0 && sco_connection_handles.size() > 0) {
Myles Watson244ad362021-04-01 17:26:43 +0000709 ASSERT_LT(0, max_sco_data_packet_length);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700710 sendAndCheckSCO(NUM_SCO_PACKETS_BANDWIDTH, max_sco_data_packet_length,
711 sco_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700712 int sco_packets_sent = NUM_SCO_PACKETS_BANDWIDTH;
Jack Hecaeab052018-10-23 18:13:51 -0700713 int completed_packets =
714 wait_for_completed_packets_event(sco_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700715 if (sco_packets_sent != completed_packets) {
Jack Hecaeab052018-10-23 18:13:51 -0700716 ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__,
717 sco_packets_sent, completed_packets);
Myles Watson0e06a632017-09-06 16:26:49 -0700718 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700719 }
720
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700721 if (acl_connection_handles.size() > 0) {
Myles Watson244ad362021-04-01 17:26:43 +0000722 ASSERT_LT(0, max_acl_data_packet_length);
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700723 sendAndCheckACL(NUM_ACL_PACKETS_BANDWIDTH, max_acl_data_packet_length,
724 acl_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700725 int acl_packets_sent = NUM_ACL_PACKETS_BANDWIDTH;
Jack Hecaeab052018-10-23 18:13:51 -0700726 int completed_packets =
727 wait_for_completed_packets_event(acl_connection_handles[0]);
Myles Watson0e06a632017-09-06 16:26:49 -0700728 if (acl_packets_sent != completed_packets) {
Jack Hecaeab052018-10-23 18:13:51 -0700729 ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__,
730 acl_packets_sent, completed_packets);
Myles Watson0e06a632017-09-06 16:26:49 -0700731 }
Andre Eisenbach89ba5282016-10-13 15:45:02 -0700732 }
733}
734
Dan Shiba4d5322020-07-28 13:09:30 -0700735GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BluetoothHidlTest);
Jakub Pawlowski13b4d312019-11-05 12:27:29 +0100736INSTANTIATE_TEST_SUITE_P(
737 PerInstance, BluetoothHidlTest,
738 testing::ValuesIn(
739 android::hardware::getAllHalInstanceNames(IBluetoothHci::descriptor)),
740 android::hardware::PrintInstanceNameToString);