189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach/* 289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * Copyright (C) 2016 The Android Open Source Project 389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * 489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * you may not use this file except in compliance with the License. 689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * You may obtain a copy of the License at 789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * 889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * 1089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * Unless required by applicable law or agreed to in writing, software 1189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 1289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * See the License for the specific language governing permissions and 1489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach * limitations under the License. 1589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach */ 1689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 1789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define LOG_TAG "bluetooth_hidl_hal_test" 1889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <android-base/logging.h> 1989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 2089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <android/hardware/bluetooth/1.0/IBluetoothHci.h> 2189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <android/hardware/bluetooth/1.0/IBluetoothHciCallbacks.h> 2289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <android/hardware/bluetooth/1.0/types.h> 2389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <hardware/bluetooth.h> 2489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <utils/Log.h> 2589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 2651d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma#include <VtsHalHidlTargetCallbackBase.h> 276b8720110bf2d40ac1364c364a85c31b358889f1Yuexi Ma#include <VtsHalHidlTargetTestBase.h> 287a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang#include <VtsHalHidlTargetTestEnvBase.h> 2989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#include <queue> 3089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 3189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::hardware::bluetooth::V1_0::IBluetoothHci; 3289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::hardware::bluetooth::V1_0::IBluetoothHciCallbacks; 3389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::hardware::bluetooth::V1_0::Status; 3489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::hardware::hidl_vec; 3589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::hardware::Return; 3689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::hardware::Void; 3789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachusing ::android::sp; 3889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 3989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define HCI_MINIMUM_HCI_VERSION 5 // Bluetooth Core Specification 3.0 + HS 4089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define HCI_MINIMUM_LMP_VERSION 5 // Bluetooth Core Specification 3.0 + HS 4189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define NUM_HCI_COMMANDS_BANDWIDTH 1000 4289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define NUM_SCO_PACKETS_BANDWIDTH 1000 4389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define NUM_ACL_PACKETS_BANDWIDTH 1000 449041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach#define WAIT_FOR_INIT_TIMEOUT std::chrono::milliseconds(2000) 4589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define WAIT_FOR_HCI_EVENT_TIMEOUT std::chrono::milliseconds(2000) 4689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define WAIT_FOR_SCO_DATA_TIMEOUT std::chrono::milliseconds(1000) 4789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define WAIT_FOR_ACL_DATA_TIMEOUT std::chrono::milliseconds(1000) 4889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 4989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define COMMAND_HCI_SHOULD_BE_UNKNOWN \ 5089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach { 0xff, 0x3B, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 } 5189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define COMMAND_HCI_READ_LOCAL_VERSION_INFORMATION \ 5289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach { 0x01, 0x10, 0x00 } 5389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define COMMAND_HCI_READ_BUFFER_SIZE \ 5489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach { 0x05, 0x10, 0x00 } 5589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define COMMAND_HCI_WRITE_LOOPBACK_MODE_LOCAL \ 5689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach { 0x02, 0x18, 0x01, 0x01 } 5789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define COMMAND_HCI_RESET \ 5889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach { 0x03, 0x0c, 0x00 } 5989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define COMMAND_HCI_WRITE_LOCAL_NAME \ 6089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach { 0x13, 0x0c, 0xf8 } 6189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define HCI_STATUS_SUCCESS 0x00 6289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define HCI_STATUS_UNKNOWN_HCI_COMMAND 0x01 6389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 6489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CONNECTION_COMPLETE 0x03 6589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_COMPLETE 0x0e 6689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_STATUS 0x0f 6789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13 6889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_LOOPBACK_COMMAND 0x19 6989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 7089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CODE_BYTE 0 7189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_LENGTH_BYTE 1 7289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_FIRST_PAYLOAD_BYTE 2 7389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_STATUS_STATUS_BYTE 2 7489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_STATUS_ALLOWED_PACKETS_BYTE 3 7589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_STATUS_OPCODE_LSBYTE 4 // Bytes 4 and 5 7689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_COMPLETE_ALLOWED_PACKETS_BYTE 2 7789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE 3 // Bytes 3 and 4 7889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_COMPLETE_STATUS_BYTE 5 7989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_COMPLETE_FIRST_PARAM_BYTE 6 8089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_LOCAL_HCI_VERSION_BYTE EVENT_COMMAND_COMPLETE_FIRST_PARAM_BYTE 8189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_LOCAL_LMP_VERSION_BYTE EVENT_LOCAL_HCI_VERSION_BYTE + 3 8289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 8389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CONNECTION_COMPLETE_PARAM_LENGTH 11 8489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CONNECTION_COMPLETE_TYPE 11 8589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CONNECTION_COMPLETE_TYPE_SCO 0 8689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CONNECTION_COMPLETE_TYPE_ACL 1 8789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_CONNECTION_COMPLETE_HANDLE_LSBYTE 3 8889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_COMMAND_STATUS_LENGTH 4 8989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 9089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach#define EVENT_NUMBER_OF_COMPLETED_PACKETS_NUM_HANDLES 2 9189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 927915b71fb9fdc8a378b2aae9b618d67bf64d4971Stanley Tng#define ACL_BROADCAST_FLAG_OFFSET 6 9372382e30140a38d311d316712623f25c79f1c5acMyles Watson#define ACL_BROADCAST_FLAG_POINT_TO_POINT 0x0 9472382e30140a38d311d316712623f25c79f1c5acMyles Watson#define ACL_BROADCAST_POINT_TO_POINT \ 9572382e30140a38d311d316712623f25c79f1c5acMyles Watson (ACL_BROADCAST_FLAG_POINT_TO_POINT << ACL_BROADCAST_FLAG_OFFSET) 967915b71fb9fdc8a378b2aae9b618d67bf64d4971Stanley Tng 977915b71fb9fdc8a378b2aae9b618d67bf64d4971Stanley Tng#define ACL_PACKET_BOUNDARY_FLAG_OFFSET 4 9872382e30140a38d311d316712623f25c79f1c5acMyles Watson#define ACL_PACKET_BOUNDARY_FLAG_FIRST_AUTO_FLUSHABLE 0x2 9972382e30140a38d311d316712623f25c79f1c5acMyles Watson#define ACL_PACKET_BOUNDARY_FIRST_AUTO_FLUSHABLE \ 10072382e30140a38d311d316712623f25c79f1c5acMyles Watson (ACL_PACKET_BOUNDARY_FLAG_FIRST_AUTO_FLUSHABLE \ 10172382e30140a38d311d316712623f25c79f1c5acMyles Watson << ACL_PACKET_BOUNDARY_FLAG_OFFSET) 10289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 10351d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Maconstexpr char kCallbackNameAclEventReceived[] = "aclDataReceived"; 10451d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Maconstexpr char kCallbackNameHciEventReceived[] = "hciEventReceived"; 10551d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Maconstexpr char kCallbackNameInitializationComplete[] = "initializationComplete"; 10651d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Maconstexpr char kCallbackNameScoEventReceived[] = "scoDataReceived"; 10751d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma 10889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachclass ThroughputLogger { 10989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach public: 11089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ThroughputLogger(std::string task) 11189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach : task_(task), start_time_(std::chrono::steady_clock::now()) {} 11289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 11389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ~ThroughputLogger() { 11489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (total_bytes_ == 0) return; 11589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::chrono::duration<double> duration = 11689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::chrono::steady_clock::now() - start_time_; 11789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach double s = duration.count(); 11889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (s == 0) return; 11989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach double rate_kb = (static_cast<double>(total_bytes_) / s) / 1024; 12089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGD("%s %.1f KB/s (%zu bytes in %.3fs)", task_.c_str(), rate_kb, 12189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach total_bytes_, s); 12289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 12389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 12489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void setTotalBytes(size_t total_bytes) { total_bytes_ = total_bytes; } 12589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 12689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach private: 12789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach size_t total_bytes_; 12889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::string task_; 12989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::chrono::steady_clock::time_point start_time_; 13089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach}; 13189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 1327a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang// Test environment for Bluetooth HIDL HAL. 1337a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhangclass BluetoothHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { 1347a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang public: 1357a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang // get the test environment singleton 1367a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang static BluetoothHidlEnvironment* Instance() { 1377a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang static BluetoothHidlEnvironment* instance = new BluetoothHidlEnvironment; 1387a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang return instance; 1397a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang } 1407a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang 1417a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang virtual void registerTestServices() override { 1427a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang registerTestService<IBluetoothHci>(); 1437a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang } 1447a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang 1457a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang private: 1467a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang BluetoothHidlEnvironment() {} 1477a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang}; 1487a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang 14989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// The main test class for Bluetooth HIDL HAL. 1506b8720110bf2d40ac1364c364a85c31b358889f1Yuexi Maclass BluetoothHidlTest : public ::testing::VtsHalHidlTargetTestBase { 15189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach public: 15289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach virtual void SetUp() override { 15389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // currently test passthrough mode only 15451d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma bluetooth = 15551d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma ::testing::VtsHalHidlTargetTestBase::getService<IBluetoothHci>(); 156dbbdf3e5bc2a1ee12c2f56da5a3a5cb639cae2f4Myles Watson ASSERT_NE(bluetooth, nullptr); 157bc7e5876ad960a0fbe7fb255239559eb27fe7d22Myles Watson ALOGI("%s: getService() for bluetooth is %s", __func__, 15889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->isRemote() ? "remote" : "local"); 15989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 16089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth_cb = new BluetoothHciCallbacks(*this); 16189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ASSERT_NE(bluetooth_cb, nullptr); 16289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 16389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_acl_data_packet_length = 0; 16489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_sco_data_packet_length = 0; 16589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_acl_data_packets = 0; 16689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_sco_data_packets = 0; 16789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 1689041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach initialized = false; 16989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach event_cb_count = 0; 17089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_cb_count = 0; 17189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_cb_count = 0; 17289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 1739041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach ASSERT_EQ(initialized, false); 1749041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach bluetooth->initialize(bluetooth_cb); 1759041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach 17651d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma bluetooth_cb->SetWaitTimeout(kCallbackNameInitializationComplete, 17751d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma WAIT_FOR_INIT_TIMEOUT); 17851d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma bluetooth_cb->SetWaitTimeout(kCallbackNameHciEventReceived, 17951d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma WAIT_FOR_HCI_EVENT_TIMEOUT); 18051d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma bluetooth_cb->SetWaitTimeout(kCallbackNameAclEventReceived, 18151d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma WAIT_FOR_ACL_DATA_TIMEOUT); 18251d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma bluetooth_cb->SetWaitTimeout(kCallbackNameScoEventReceived, 18351d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma WAIT_FOR_SCO_DATA_TIMEOUT); 18451d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma 18551d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma EXPECT_TRUE( 18651d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma bluetooth_cb->WaitForCallback(kCallbackNameInitializationComplete) 187b8012eb907639990f4cbfe04ca1490d1ab270168Yuexi Ma .no_timeout); 1889041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach 1899041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach ASSERT_EQ(initialized, true); 19089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 19189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 19289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach virtual void TearDown() override { 19389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->close(); 19472382e30140a38d311d316712623f25c79f1c5acMyles Watson handle_no_ops(); 19589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(static_cast<size_t>(0), event_queue.size()); 19689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(static_cast<size_t>(0), sco_queue.size()); 19789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(static_cast<size_t>(0), acl_queue.size()); 19889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 19989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 20089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void setBufferSizes(); 20189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 20289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Functions called from within tests in loopback mode 20389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void sendAndCheckHCI(int num_packets); 20489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void sendAndCheckSCO(int num_packets, size_t size, uint16_t handle); 20589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void sendAndCheckACL(int num_packets, size_t size, uint16_t handle); 20689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 20789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Helper functions to try to get a handle on verbosity 20889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void enterLoopbackMode(std::vector<uint16_t>& sco_handles, 20989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t>& acl_handles); 21072382e30140a38d311d316712623f25c79f1c5acMyles Watson void handle_no_ops(); 21172382e30140a38d311d316712623f25c79f1c5acMyles Watson void wait_for_event(bool timeout_is_error); 21289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach void wait_for_command_complete_event(hidl_vec<uint8_t> cmd); 21389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int wait_for_completed_packets_event(uint16_t handle); 21489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 21589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // A simple test implementation of BluetoothHciCallbacks. 21651d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma class BluetoothHciCallbacks 21751d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma : public ::testing::VtsHalHidlTargetCallbackBase<BluetoothHidlTest>, 21851d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma public IBluetoothHciCallbacks { 21989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach BluetoothHidlTest& parent_; 22089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 22189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach public: 22289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach BluetoothHciCallbacks(BluetoothHidlTest& parent) : parent_(parent){}; 22389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 22489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach virtual ~BluetoothHciCallbacks() = default; 22589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 2269041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach Return<void> initializationComplete(Status status) override { 227bc7e5876ad960a0fbe7fb255239559eb27fe7d22Myles Watson parent_.initialized = (status == Status::SUCCESS); 22851d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma NotifyFromCallback(kCallbackNameInitializationComplete); 2299041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach ALOGV("%s (status = %d)", __func__, static_cast<int>(status)); 2309041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach return Void(); 2319041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach }; 2329041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach 23389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach Return<void> hciEventReceived( 23489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach const ::android::hardware::hidl_vec<uint8_t>& event) override { 23589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach parent_.event_cb_count++; 23689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach parent_.event_queue.push(event); 23751d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma NotifyFromCallback(kCallbackNameHciEventReceived); 23889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGV("Event received (length = %d)", static_cast<int>(event.size())); 23989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach return Void(); 24089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach }; 24189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 24289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach Return<void> aclDataReceived( 24389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach const ::android::hardware::hidl_vec<uint8_t>& data) override { 24489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach parent_.acl_cb_count++; 24589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach parent_.acl_queue.push(data); 24651d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma NotifyFromCallback(kCallbackNameAclEventReceived); 24789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach return Void(); 24889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach }; 24989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 25089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach Return<void> scoDataReceived( 25189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach const ::android::hardware::hidl_vec<uint8_t>& data) override { 25289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach parent_.sco_cb_count++; 25389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach parent_.sco_queue.push(data); 25451d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma NotifyFromCallback(kCallbackNameScoEventReceived); 25589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach return Void(); 25689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach }; 25789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach }; 25889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 25989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sp<IBluetoothHci> bluetooth; 26051d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi Ma sp<BluetoothHciCallbacks> bluetooth_cb; 26189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::queue<hidl_vec<uint8_t>> event_queue; 26289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::queue<hidl_vec<uint8_t>> acl_queue; 26389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::queue<hidl_vec<uint8_t>> sco_queue; 26489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 2659041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach bool initialized; 2669041d97812134889d0b00541d1fe517c2b23fe74Andre Eisenbach 26789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int event_cb_count; 26889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int sco_cb_count; 26989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int acl_cb_count; 27089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 27189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int max_acl_data_packet_length; 27289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int max_sco_data_packet_length; 27389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int max_acl_data_packets; 27489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int max_sco_data_packets; 27589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach}; 27689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 27772382e30140a38d311d316712623f25c79f1c5acMyles Watson// Discard NO-OPs from the event queue. 27872382e30140a38d311d316712623f25c79f1c5acMyles Watsonvoid BluetoothHidlTest::handle_no_ops() { 27972382e30140a38d311d316712623f25c79f1c5acMyles Watson while (event_queue.size() > 0) { 28072382e30140a38d311d316712623f25c79f1c5acMyles Watson hidl_vec<uint8_t> event = event_queue.front(); 28172382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_GE(event.size(), 28272382e30140a38d311d316712623f25c79f1c5acMyles Watson static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE)); 28372382e30140a38d311d316712623f25c79f1c5acMyles Watson bool event_is_no_op = 28472382e30140a38d311d316712623f25c79f1c5acMyles Watson (event[EVENT_CODE_BYTE] == EVENT_COMMAND_COMPLETE) && 28572382e30140a38d311d316712623f25c79f1c5acMyles Watson (event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE] == 0x00) && 28672382e30140a38d311d316712623f25c79f1c5acMyles Watson (event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1] == 0x00); 28772382e30140a38d311d316712623f25c79f1c5acMyles Watson event_is_no_op |= (event[EVENT_CODE_BYTE] == EVENT_COMMAND_STATUS) && 28872382e30140a38d311d316712623f25c79f1c5acMyles Watson (event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE] == 0x00) && 28972382e30140a38d311d316712623f25c79f1c5acMyles Watson (event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE + 1] == 0x00); 29072382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_is_no_op) { 29172382e30140a38d311d316712623f25c79f1c5acMyles Watson event_queue.pop(); 29272382e30140a38d311d316712623f25c79f1c5acMyles Watson } else { 29372382e30140a38d311d316712623f25c79f1c5acMyles Watson return; 29472382e30140a38d311d316712623f25c79f1c5acMyles Watson } 29572382e30140a38d311d316712623f25c79f1c5acMyles Watson } 29672382e30140a38d311d316712623f25c79f1c5acMyles Watson} 29772382e30140a38d311d316712623f25c79f1c5acMyles Watson 29872382e30140a38d311d316712623f25c79f1c5acMyles Watson// Receive an event, discarding NO-OPs. 29972382e30140a38d311d316712623f25c79f1c5acMyles Watsonvoid BluetoothHidlTest::wait_for_event(bool timeout_is_error = true) { 30089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> event; 30189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach do { 30272382e30140a38d311d316712623f25c79f1c5acMyles Watson bool no_timeout = 30372382e30140a38d311d316712623f25c79f1c5acMyles Watson bluetooth_cb->WaitForCallback(kCallbackNameHciEventReceived).no_timeout; 30472382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_TRUE(no_timeout || !timeout_is_error); 30572382e30140a38d311d316712623f25c79f1c5acMyles Watson if (no_timeout && timeout_is_error) { 306b8012eb907639990f4cbfe04ca1490d1ab270168Yuexi Ma EXPECT_LT(static_cast<size_t>(0), event_queue.size()); 30789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 30872382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_queue.size() == 0) { 30972382e30140a38d311d316712623f25c79f1c5acMyles Watson // WaitForCallback timed out. 31072382e30140a38d311d316712623f25c79f1c5acMyles Watson return; 31189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 31272382e30140a38d311d316712623f25c79f1c5acMyles Watson handle_no_ops(); 31372382e30140a38d311d316712623f25c79f1c5acMyles Watson } while (event_queue.size() == 0); 31472382e30140a38d311d316712623f25c79f1c5acMyles Watson} 31572382e30140a38d311d316712623f25c79f1c5acMyles Watson 31672382e30140a38d311d316712623f25c79f1c5acMyles Watson// Wait until a COMMAND_COMPLETE is received. 31772382e30140a38d311d316712623f25c79f1c5acMyles Watsonvoid BluetoothHidlTest::wait_for_command_complete_event(hidl_vec<uint8_t> cmd) { 31872382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(); 31972382e30140a38d311d316712623f25c79f1c5acMyles Watson hidl_vec<uint8_t> event = event_queue.front(); 32072382e30140a38d311d316712623f25c79f1c5acMyles Watson event_queue.pop(); 32189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 32289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_GT(event.size(), 32389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE)); 32489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]); 32589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]); 32689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]); 32789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]); 32889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 32989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 33089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send the command to read the controller's buffer sizes. 33189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachvoid BluetoothHidlTest::setBufferSizes() { 33289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> cmd = COMMAND_HCI_READ_BUFFER_SIZE; 33389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendHciCommand(cmd); 33489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 33572382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(); 33689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (event_queue.size() == 0) return; 33789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 33889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> event = event_queue.front(); 33989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach event_queue.pop(); 34089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 34189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]); 34289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]); 34389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]); 34489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]); 34589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 34689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_acl_data_packet_length = 34789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 1] + 34889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach (event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 2] << 8); 34989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_sco_data_packet_length = event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 3]; 35089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_acl_data_packets = event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 4] + 35189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach (event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 5] << 8); 35289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach max_sco_data_packets = event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 6] + 35389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach (event[EVENT_COMMAND_COMPLETE_STATUS_BYTE + 7] << 8); 35489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 35589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGD("%s: ACL max %d num %d SCO max %d num %d", __func__, 35689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach static_cast<int>(max_acl_data_packet_length), 35789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach static_cast<int>(max_acl_data_packets), 35889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach static_cast<int>(max_sco_data_packet_length), 35989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach static_cast<int>(max_sco_data_packets)); 36089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 36189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 36289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send an HCI command (in Loopback mode) and check the response. 36389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachvoid BluetoothHidlTest::sendAndCheckHCI(int num_packets) { 36489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ThroughputLogger logger = {__func__}; 36572382e30140a38d311d316712623f25c79f1c5acMyles Watson int command_size = 0; 36689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (int n = 0; n < num_packets; n++) { 36789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Send an HCI packet 36889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint8_t> write_name = COMMAND_HCI_WRITE_LOCAL_NAME; 36989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // With a name 37089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach char new_name[] = "John Jacob Jingleheimer Schmidt ___________________0"; 37189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach size_t new_name_length = strlen(new_name); 37289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < new_name_length; i++) 37389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach write_name.push_back(static_cast<uint8_t>(new_name[i])); 37489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // And the packet number 37572382e30140a38d311d316712623f25c79f1c5acMyles Watson size_t i = new_name_length - 1; 37672382e30140a38d311d316712623f25c79f1c5acMyles Watson for (int digits = n; digits > 0; digits = digits / 10, i--) 37772382e30140a38d311d316712623f25c79f1c5acMyles Watson write_name[i] = static_cast<uint8_t>('0' + digits % 10); 37889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // And padding 37989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < 248 - new_name_length; i++) 38089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach write_name.push_back(static_cast<uint8_t>(0)); 38189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 38289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> cmd = write_name; 38389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendHciCommand(cmd); 38489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 38589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Check the loopback of the HCI packet 38672382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(); 38772382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_queue.size() == 0) return; 38872382e30140a38d311d316712623f25c79f1c5acMyles Watson 38989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> event = event_queue.front(); 39089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach event_queue.pop(); 39189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach size_t compare_length = 39289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach (cmd.size() > static_cast<size_t>(0xff) ? static_cast<size_t>(0xff) 39389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach : cmd.size()); 39489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_GT(event.size(), compare_length + EVENT_FIRST_PAYLOAD_BYTE - 1); 39589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 39689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(EVENT_LOOPBACK_COMMAND, event[EVENT_CODE_BYTE]); 39789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(compare_length, event[EVENT_LENGTH_BYTE]); 39872382e30140a38d311d316712623f25c79f1c5acMyles Watson 39972382e30140a38d311d316712623f25c79f1c5acMyles Watson // Don't compare past the end of the event. 40072382e30140a38d311d316712623f25c79f1c5acMyles Watson if (compare_length + EVENT_FIRST_PAYLOAD_BYTE > event.size()) { 40172382e30140a38d311d316712623f25c79f1c5acMyles Watson compare_length = event.size() - EVENT_FIRST_PAYLOAD_BYTE; 40272382e30140a38d311d316712623f25c79f1c5acMyles Watson ALOGE("Only comparing %d bytes", static_cast<int>(compare_length)); 40372382e30140a38d311d316712623f25c79f1c5acMyles Watson } 40472382e30140a38d311d316712623f25c79f1c5acMyles Watson 40572382e30140a38d311d316712623f25c79f1c5acMyles Watson if (n == num_packets - 1) { 40672382e30140a38d311d316712623f25c79f1c5acMyles Watson command_size = cmd.size(); 40772382e30140a38d311d316712623f25c79f1c5acMyles Watson } 40889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 40989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < compare_length; i++) 41089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[i], event[EVENT_FIRST_PAYLOAD_BYTE + i]); 41189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 41272382e30140a38d311d316712623f25c79f1c5acMyles Watson logger.setTotalBytes(command_size * num_packets * 2); 41389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 41489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 41589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send a SCO data packet (in Loopback mode) and check the response. 41689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachvoid BluetoothHidlTest::sendAndCheckSCO(int num_packets, size_t size, 41789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach uint16_t handle) { 41889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ThroughputLogger logger = {__func__}; 41989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (int n = 0; n < num_packets; n++) { 42089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Send a SCO packet 42189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> sco_packet; 42289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint8_t> sco_vector; 42389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_vector.push_back(static_cast<uint8_t>(handle & 0xff)); 42489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_vector.push_back(static_cast<uint8_t>((handle & 0x0f00) >> 8)); 42589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_vector.push_back(static_cast<uint8_t>(size & 0xff)); 42689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_vector.push_back(static_cast<uint8_t>((size & 0xff00) >> 8)); 42789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < size; i++) { 42889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_vector.push_back(static_cast<uint8_t>(i + n)); 42989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 43089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_packet = sco_vector; 43189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendScoData(sco_vector); 43289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 43389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Check the loopback of the SCO packet 434b8012eb907639990f4cbfe04ca1490d1ab270168Yuexi Ma EXPECT_TRUE(bluetooth_cb->WaitForCallback(kCallbackNameScoEventReceived) 435b8012eb907639990f4cbfe04ca1490d1ab270168Yuexi Ma .no_timeout); 43689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> sco_loopback = sco_queue.front(); 43789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_queue.pop(); 43889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 43989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(sco_packet.size(), sco_loopback.size()); 44089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach size_t successful_bytes = 0; 44189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 44289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < sco_packet.size(); i++) { 44389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (sco_packet[i] == sco_loopback[i]) { 44489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach successful_bytes = i; 44589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } else { 44689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGE("Miscompare at %d (expected %x, got %x)", static_cast<int>(i), 44789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_packet[i], sco_loopback[i]); 44889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGE("At %d (expected %x, got %x)", static_cast<int>(i + 1), 44989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_packet[i + 1], sco_loopback[i + 1]); 45089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach break; 45189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 45289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 45389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(sco_packet.size(), successful_bytes + 1); 45489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 45572382e30140a38d311d316712623f25c79f1c5acMyles Watson logger.setTotalBytes(num_packets * size * 2); 45689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 45789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 45889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send an ACL data packet (in Loopback mode) and check the response. 45989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachvoid BluetoothHidlTest::sendAndCheckACL(int num_packets, size_t size, 46089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach uint16_t handle) { 46189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ThroughputLogger logger = {__func__}; 46289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (int n = 0; n < num_packets; n++) { 46389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Send an ACL packet 46489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> acl_packet; 46589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint8_t> acl_vector; 46689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_vector.push_back(static_cast<uint8_t>(handle & 0xff)); 46789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_vector.push_back(static_cast<uint8_t>((handle & 0x0f00) >> 8) | 46872382e30140a38d311d316712623f25c79f1c5acMyles Watson ACL_BROADCAST_POINT_TO_POINT | 46972382e30140a38d311d316712623f25c79f1c5acMyles Watson ACL_PACKET_BOUNDARY_FIRST_AUTO_FLUSHABLE); 47089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_vector.push_back(static_cast<uint8_t>(size & 0xff)); 47189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_vector.push_back(static_cast<uint8_t>((size & 0xff00) >> 8)); 47289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < size; i++) { 47389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_vector.push_back(static_cast<uint8_t>(i + n)); 47489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 47589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_packet = acl_vector; 47689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendAclData(acl_vector); 47789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 47889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Check the loopback of the ACL packet 479b8012eb907639990f4cbfe04ca1490d1ab270168Yuexi Ma EXPECT_TRUE(bluetooth_cb->WaitForCallback(kCallbackNameAclEventReceived) 480b8012eb907639990f4cbfe04ca1490d1ab270168Yuexi Ma .no_timeout); 48189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> acl_loopback = acl_queue.front(); 48289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_queue.pop(); 48389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 48489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(acl_packet.size(), acl_loopback.size()); 48589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach size_t successful_bytes = 0; 48689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 48789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach for (size_t i = 0; i < acl_packet.size(); i++) { 48889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (acl_packet[i] == acl_loopback[i]) { 48989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach successful_bytes = i; 49089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } else { 49189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGE("Miscompare at %d (expected %x, got %x)", static_cast<int>(i), 49289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_packet[i], acl_loopback[i]); 49389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGE("At %d (expected %x, got %x)", static_cast<int>(i + 1), 49489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_packet[i + 1], acl_loopback[i + 1]); 49589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach break; 49689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 49789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 49889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(acl_packet.size(), successful_bytes + 1); 49989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 50072382e30140a38d311d316712623f25c79f1c5acMyles Watson logger.setTotalBytes(num_packets * size * 2); 50189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 50289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 50389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Return the number of completed packets reported by the controller. 50489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachint BluetoothHidlTest::wait_for_completed_packets_event(uint16_t handle) { 50572382e30140a38d311d316712623f25c79f1c5acMyles Watson int packets_processed = 0; 50672382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(false); 50772382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_queue.size() == 0) { 50872382e30140a38d311d316712623f25c79f1c5acMyles Watson ALOGW("%s: WaitForCallback timed out.", __func__); 50972382e30140a38d311d316712623f25c79f1c5acMyles Watson return packets_processed; 51072382e30140a38d311d316712623f25c79f1c5acMyles Watson } 51172382e30140a38d311d316712623f25c79f1c5acMyles Watson while (event_queue.size() > 0) { 51272382e30140a38d311d316712623f25c79f1c5acMyles Watson hidl_vec<uint8_t> event = event_queue.front(); 51372382e30140a38d311d316712623f25c79f1c5acMyles Watson event_queue.pop(); 51489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 51572382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(EVENT_NUMBER_OF_COMPLETED_PACKETS, event[EVENT_CODE_BYTE]); 51672382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(1, event[EVENT_NUMBER_OF_COMPLETED_PACKETS_NUM_HANDLES]); 51789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 51872382e30140a38d311d316712623f25c79f1c5acMyles Watson uint16_t event_handle = event[3] + (event[4] << 8); 51972382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(handle, event_handle); 52089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 52172382e30140a38d311d316712623f25c79f1c5acMyles Watson packets_processed += event[5] + (event[6] << 8); 52289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 52389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach return packets_processed; 52489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 52589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 52689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send local loopback command and initialize SCO and ACL handles. 52789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachvoid BluetoothHidlTest::enterLoopbackMode(std::vector<uint16_t>& sco_handles, 52889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t>& acl_handles) { 52989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> cmd = COMMAND_HCI_WRITE_LOOPBACK_MODE_LOCAL; 53089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendHciCommand(cmd); 53189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 53289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // Receive connection complete events with data channels 53389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int connection_event_count = 0; 53472382e30140a38d311d316712623f25c79f1c5acMyles Watson bool command_complete_received = false; 53572382e30140a38d311d316712623f25c79f1c5acMyles Watson while (true) { 53672382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(false); 53772382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_queue.size() == 0) { 53872382e30140a38d311d316712623f25c79f1c5acMyles Watson // Fail if there was no event received or no connections completed. 53972382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_TRUE(command_complete_received); 54072382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_LT(0, connection_event_count); 54172382e30140a38d311d316712623f25c79f1c5acMyles Watson return; 54272382e30140a38d311d316712623f25c79f1c5acMyles Watson } 54372382e30140a38d311d316712623f25c79f1c5acMyles Watson hidl_vec<uint8_t> event = event_queue.front(); 54472382e30140a38d311d316712623f25c79f1c5acMyles Watson event_queue.pop(); 54572382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_GT(event.size(), 54672382e30140a38d311d316712623f25c79f1c5acMyles Watson static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE)); 54772382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event[EVENT_CODE_BYTE] == EVENT_CONNECTION_COMPLETE) { 54889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_GT(event.size(), 54972382e30140a38d311d316712623f25c79f1c5acMyles Watson static_cast<size_t>(EVENT_CONNECTION_COMPLETE_TYPE)); 55072382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(event[EVENT_LENGTH_BYTE], 55172382e30140a38d311d316712623f25c79f1c5acMyles Watson EVENT_CONNECTION_COMPLETE_PARAM_LENGTH); 55272382e30140a38d311d316712623f25c79f1c5acMyles Watson uint8_t connection_type = event[EVENT_CONNECTION_COMPLETE_TYPE]; 55372382e30140a38d311d316712623f25c79f1c5acMyles Watson 55472382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_TRUE(connection_type == EVENT_CONNECTION_COMPLETE_TYPE_SCO || 55572382e30140a38d311d316712623f25c79f1c5acMyles Watson connection_type == EVENT_CONNECTION_COMPLETE_TYPE_ACL); 55672382e30140a38d311d316712623f25c79f1c5acMyles Watson 55772382e30140a38d311d316712623f25c79f1c5acMyles Watson // Save handles 55872382e30140a38d311d316712623f25c79f1c5acMyles Watson uint16_t handle = event[EVENT_CONNECTION_COMPLETE_HANDLE_LSBYTE] | 55972382e30140a38d311d316712623f25c79f1c5acMyles Watson event[EVENT_CONNECTION_COMPLETE_HANDLE_LSBYTE + 1] << 8; 56072382e30140a38d311d316712623f25c79f1c5acMyles Watson if (connection_type == EVENT_CONNECTION_COMPLETE_TYPE_SCO) 56172382e30140a38d311d316712623f25c79f1c5acMyles Watson sco_handles.push_back(handle); 56272382e30140a38d311d316712623f25c79f1c5acMyles Watson else 56372382e30140a38d311d316712623f25c79f1c5acMyles Watson acl_handles.push_back(handle); 56472382e30140a38d311d316712623f25c79f1c5acMyles Watson 56572382e30140a38d311d316712623f25c79f1c5acMyles Watson ALOGD("Connect complete type = %d handle = %d", 56672382e30140a38d311d316712623f25c79f1c5acMyles Watson event[EVENT_CONNECTION_COMPLETE_TYPE], handle); 56772382e30140a38d311d316712623f25c79f1c5acMyles Watson connection_event_count++; 56872382e30140a38d311d316712623f25c79f1c5acMyles Watson } else { 56972382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]); 57072382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]); 57172382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]); 57272382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]); 57372382e30140a38d311d316712623f25c79f1c5acMyles Watson command_complete_received = true; 57489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 57572382e30140a38d311d316712623f25c79f1c5acMyles Watson } 57689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 57789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 57889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Empty test: Initialize()/Close() are called in SetUp()/TearDown(). 57951d023c48ec6cf709e756ceed62c11b25fb0c085Yuexi MaTEST_F(BluetoothHidlTest, InitializeAndClose) {} 58089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 58189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send an HCI Reset with sendHciCommand and wait for a command complete event. 58289ba5284e33789c598017235e45a58dd477f9a63Andre EisenbachTEST_F(BluetoothHidlTest, HciReset) { 58389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> cmd = COMMAND_HCI_RESET; 58489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendHciCommand(cmd); 58589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 58689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach wait_for_command_complete_event(cmd); 58789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 58889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 58989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Read and check the HCI version of the controller. 59089ba5284e33789c598017235e45a58dd477f9a63Andre EisenbachTEST_F(BluetoothHidlTest, HciVersionTest) { 59189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> cmd = COMMAND_HCI_READ_LOCAL_VERSION_INFORMATION; 59289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendHciCommand(cmd); 59389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 59472382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(); 59572382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_queue.size() == 0) return; 59689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 59789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> event = event_queue.front(); 59889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach event_queue.pop(); 59989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_GT(event.size(), static_cast<size_t>(EVENT_LOCAL_LMP_VERSION_BYTE)); 60089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 60189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(EVENT_COMMAND_COMPLETE, event[EVENT_CODE_BYTE]); 60289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]); 60389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]); 60489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_EQ(HCI_STATUS_SUCCESS, event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]); 60589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 60689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_LE(HCI_MINIMUM_HCI_VERSION, event[EVENT_LOCAL_HCI_VERSION_BYTE]); 60789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach EXPECT_LE(HCI_MINIMUM_LMP_VERSION, event[EVENT_LOCAL_LMP_VERSION_BYTE]); 60889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 60989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 61089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Send an unknown HCI command and wait for the error message. 61189ba5284e33789c598017235e45a58dd477f9a63Andre EisenbachTEST_F(BluetoothHidlTest, HciUnknownCommand) { 61289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> cmd = COMMAND_HCI_SHOULD_BE_UNKNOWN; 61389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach bluetooth->sendHciCommand(cmd); 61489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 61572382e30140a38d311d316712623f25c79f1c5acMyles Watson wait_for_event(); 61672382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event_queue.size() == 0) return; 61789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 61889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach hidl_vec<uint8_t> event = event_queue.front(); 61989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach event_queue.pop(); 62089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 62172382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_GT(event.size(), 62272382e30140a38d311d316712623f25c79f1c5acMyles Watson static_cast<size_t>(EVENT_COMMAND_COMPLETE_STATUS_BYTE)); 62372382e30140a38d311d316712623f25c79f1c5acMyles Watson if (event[EVENT_CODE_BYTE] == EVENT_COMMAND_COMPLETE) { 62472382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(cmd[0], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE]); 62572382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(cmd[1], event[EVENT_COMMAND_COMPLETE_OPCODE_LSBYTE + 1]); 62672382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(HCI_STATUS_UNKNOWN_HCI_COMMAND, 62772382e30140a38d311d316712623f25c79f1c5acMyles Watson event[EVENT_COMMAND_COMPLETE_STATUS_BYTE]); 62872382e30140a38d311d316712623f25c79f1c5acMyles Watson } else { 62972382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(EVENT_COMMAND_STATUS, event[EVENT_CODE_BYTE]); 63072382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(cmd[0], event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE]); 63172382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(cmd[1], event[EVENT_COMMAND_STATUS_OPCODE_LSBYTE + 1]); 63272382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_EQ(HCI_STATUS_UNKNOWN_HCI_COMMAND, 63372382e30140a38d311d316712623f25c79f1c5acMyles Watson event[EVENT_COMMAND_STATUS_STATUS_BYTE]); 63472382e30140a38d311d316712623f25c79f1c5acMyles Watson } 63589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 63689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 63789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Enter loopback mode, but don't send any packets. 63889ba5284e33789c598017235e45a58dd477f9a63Andre EisenbachTEST_F(BluetoothHidlTest, WriteLoopbackMode) { 63989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t> sco_connection_handles; 64089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t> acl_connection_handles; 64189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach enterLoopbackMode(sco_connection_handles, acl_connection_handles); 64289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 64389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 64489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Enter loopback mode and send single packets. 64589ba5284e33789c598017235e45a58dd477f9a63Andre EisenbachTEST_F(BluetoothHidlTest, LoopbackModeSinglePackets) { 64689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach setBufferSizes(); 64789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 64889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t> sco_connection_handles; 64989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t> acl_connection_handles; 65089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach enterLoopbackMode(sco_connection_handles, acl_connection_handles); 65189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 65289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sendAndCheckHCI(1); 65389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 65489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // This should work, but breaks on some current platforms. Figure out how to 65589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // grandfather older devices but test new ones. 65689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (0 && sco_connection_handles.size() > 0) { 65772382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_LT(0, max_sco_data_packet_length); 65889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sendAndCheckSCO(1, max_sco_data_packet_length, sco_connection_handles[0]); 6590e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int sco_packets_sent = 1; 6600e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int completed_packets = wait_for_completed_packets_event(sco_connection_handles[0]); 6610e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson if (sco_packets_sent != completed_packets) { 6620e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, sco_packets_sent, 6630e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson completed_packets); 6640e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson } 66589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 66689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 66789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (acl_connection_handles.size() > 0) { 66872382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_LT(0, max_acl_data_packet_length); 66989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sendAndCheckACL(1, max_acl_data_packet_length, acl_connection_handles[0]); 6700e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int acl_packets_sent = 1; 6710e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int completed_packets = wait_for_completed_packets_event(acl_connection_handles[0]); 6720e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson if (acl_packets_sent != completed_packets) { 6730e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, acl_packets_sent, 6740e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson completed_packets); 6750e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson } 67689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 67789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 67889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 67989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach// Enter loopback mode and send packets for bandwidth measurements. 68089ba5284e33789c598017235e45a58dd477f9a63Andre EisenbachTEST_F(BluetoothHidlTest, LoopbackModeBandwidth) { 68189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach setBufferSizes(); 68289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 68389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t> sco_connection_handles; 68489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach std::vector<uint16_t> acl_connection_handles; 68589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach enterLoopbackMode(sco_connection_handles, acl_connection_handles); 68689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 68789ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sendAndCheckHCI(NUM_HCI_COMMANDS_BANDWIDTH); 68889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 68989ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // This should work, but breaks on some current platforms. Figure out how to 69089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach // grandfather older devices but test new ones. 69189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (0 && sco_connection_handles.size() > 0) { 69272382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_LT(0, max_sco_data_packet_length); 69389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sendAndCheckSCO(NUM_SCO_PACKETS_BANDWIDTH, max_sco_data_packet_length, 69489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sco_connection_handles[0]); 6950e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int sco_packets_sent = NUM_SCO_PACKETS_BANDWIDTH; 6960e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int completed_packets = wait_for_completed_packets_event(sco_connection_handles[0]); 6970e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson if (sco_packets_sent != completed_packets) { 6980e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, sco_packets_sent, 6990e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson completed_packets); 7000e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson } 70189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 70289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 70389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach if (acl_connection_handles.size() > 0) { 70472382e30140a38d311d316712623f25c79f1c5acMyles Watson EXPECT_LT(0, max_acl_data_packet_length); 70589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach sendAndCheckACL(NUM_ACL_PACKETS_BANDWIDTH, max_acl_data_packet_length, 70689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach acl_connection_handles[0]); 7070e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int acl_packets_sent = NUM_ACL_PACKETS_BANDWIDTH; 7080e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson int completed_packets = wait_for_completed_packets_event(acl_connection_handles[0]); 7090e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson if (acl_packets_sent != completed_packets) { 7100e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, acl_packets_sent, 7110e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson completed_packets); 7120e06a63c76f4c02ac307c6294f3d6f61ae6406e7Myles Watson } 71389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach } 71489ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 71589ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach 71689ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbachint main(int argc, char** argv) { 7177a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang ::testing::AddGlobalTestEnvironment(BluetoothHidlEnvironment::Instance()); 71889ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ::testing::InitGoogleTest(&argc, argv); 7197a727ff3ec32bb138c7e4d82c45f9706e0a16b1dZhuoyao Zhang BluetoothHidlEnvironment::Instance()->init(&argc, argv); 72089ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach int status = RUN_ALL_TESTS(); 72189ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach ALOGI("Test result = %d", status); 72289ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach return status; 72389ba5284e33789c598017235e45a58dd477f9a63Andre Eisenbach} 724