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