xref: /aosp_15_r20/hardware/interfaces/bluetooth/aidl/vts/VtsHalBluetoothTargetTest.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include <VtsCoreUtil.h>
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/BnBluetoothHciCallbacks.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/IBluetoothHci.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/IBluetoothHciCallbacks.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/Status.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <android-base/properties.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_auto_utils.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_manager.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_process.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker #include <chrono>
31*4d7e907cSAndroid Build Coastguard Worker #include <condition_variable>
32*4d7e907cSAndroid Build Coastguard Worker #include <future>
33*4d7e907cSAndroid Build Coastguard Worker #include <queue>
34*4d7e907cSAndroid Build Coastguard Worker #include <thread>
35*4d7e907cSAndroid Build Coastguard Worker #include <utility>
36*4d7e907cSAndroid Build Coastguard Worker #include <vector>
37*4d7e907cSAndroid Build Coastguard Worker 
38*4d7e907cSAndroid Build Coastguard Worker // TODO: Remove custom logging defines from PDL packets.
39*4d7e907cSAndroid Build Coastguard Worker #undef LOG_INFO
40*4d7e907cSAndroid Build Coastguard Worker #undef LOG_DEBUG
41*4d7e907cSAndroid Build Coastguard Worker #undef LOG_TAG
42*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "VtsHalBluetooth"
43*4d7e907cSAndroid Build Coastguard Worker #include "hci/hci_packets.h"
44*4d7e907cSAndroid Build Coastguard Worker #include "packet/raw_builder.h"
45*4d7e907cSAndroid Build Coastguard Worker 
46*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::bluetooth::IBluetoothHci;
47*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::bluetooth::IBluetoothHciCallbacks;
48*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::bluetooth::Status;
49*4d7e907cSAndroid Build Coastguard Worker using ndk::ScopedAStatus;
50*4d7e907cSAndroid Build Coastguard Worker using ndk::SpAIBinder;
51*4d7e907cSAndroid Build Coastguard Worker 
52*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::CommandBuilder;
53*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::CommandCompleteView;
54*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::CommandView;
55*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::ErrorCode;
56*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::EventView;
57*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LeReadLocalSupportedFeaturesBuilder;
58*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LeReadLocalSupportedFeaturesCompleteView;
59*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LeReadNumberOfSupportedAdvertisingSetsBuilder;
60*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LeReadNumberOfSupportedAdvertisingSetsCompleteView;
61*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LeReadResolvingListSizeBuilder;
62*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LeReadResolvingListSizeCompleteView;
63*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::LLFeaturesBits;
64*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::OpCode;
65*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::OpCodeText;
66*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::PacketView;
67*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::ReadLocalVersionInformationBuilder;
68*4d7e907cSAndroid Build Coastguard Worker using ::bluetooth::hci::ReadLocalVersionInformationCompleteView;
69*4d7e907cSAndroid Build Coastguard Worker 
70*4d7e907cSAndroid Build Coastguard Worker static constexpr uint8_t kMinLeAdvSetForBt5 = 10;
71*4d7e907cSAndroid Build Coastguard Worker static constexpr uint8_t kMinLeAdvSetForBt5ForTv = 10;
72*4d7e907cSAndroid Build Coastguard Worker static constexpr uint8_t kMinLeResolvingListForBt5 = 8;
73*4d7e907cSAndroid Build Coastguard Worker 
74*4d7e907cSAndroid Build Coastguard Worker static constexpr size_t kNumHciCommandsBandwidth = 100;
75*4d7e907cSAndroid Build Coastguard Worker static constexpr size_t kNumAclPacketsBandwidth = 100;
76*4d7e907cSAndroid Build Coastguard Worker static constexpr std::chrono::milliseconds kWaitForInitTimeout(2000);
77*4d7e907cSAndroid Build Coastguard Worker static constexpr std::chrono::milliseconds kWaitForHciEventTimeout(2000);
78*4d7e907cSAndroid Build Coastguard Worker static constexpr std::chrono::milliseconds kWaitForAclDataTimeout(1000);
79*4d7e907cSAndroid Build Coastguard Worker static constexpr std::chrono::milliseconds kInterfaceCloseDelayMs(200);
80*4d7e907cSAndroid Build Coastguard Worker 
81*4d7e907cSAndroid Build Coastguard Worker // To discard Qualcomm ACL debugging
82*4d7e907cSAndroid Build Coastguard Worker static constexpr uint16_t kAclHandleQcaDebugMessage = 0xedc;
83*4d7e907cSAndroid Build Coastguard Worker 
get_vsr_api_level()84*4d7e907cSAndroid Build Coastguard Worker static int get_vsr_api_level() {
85*4d7e907cSAndroid Build Coastguard Worker   int vendor_api_level =
86*4d7e907cSAndroid Build Coastguard Worker       ::android::base::GetIntProperty("ro.vendor.api_level", -1);
87*4d7e907cSAndroid Build Coastguard Worker   if (vendor_api_level != -1) {
88*4d7e907cSAndroid Build Coastguard Worker     return vendor_api_level;
89*4d7e907cSAndroid Build Coastguard Worker   }
90*4d7e907cSAndroid Build Coastguard Worker 
91*4d7e907cSAndroid Build Coastguard Worker   // Android S and older devices do not define ro.vendor.api_level
92*4d7e907cSAndroid Build Coastguard Worker   vendor_api_level = ::android::base::GetIntProperty("ro.board.api_level", -1);
93*4d7e907cSAndroid Build Coastguard Worker   if (vendor_api_level == -1) {
94*4d7e907cSAndroid Build Coastguard Worker     vendor_api_level =
95*4d7e907cSAndroid Build Coastguard Worker         ::android::base::GetIntProperty("ro.board.first_api_level", -1);
96*4d7e907cSAndroid Build Coastguard Worker   }
97*4d7e907cSAndroid Build Coastguard Worker 
98*4d7e907cSAndroid Build Coastguard Worker   int product_api_level =
99*4d7e907cSAndroid Build Coastguard Worker       ::android::base::GetIntProperty("ro.product.first_api_level", -1);
100*4d7e907cSAndroid Build Coastguard Worker   if (product_api_level == -1) {
101*4d7e907cSAndroid Build Coastguard Worker     product_api_level =
102*4d7e907cSAndroid Build Coastguard Worker         ::android::base::GetIntProperty("ro.build.version.sdk", -1);
103*4d7e907cSAndroid Build Coastguard Worker     EXPECT_NE(product_api_level, -1) << "Could not find ro.build.version.sdk";
104*4d7e907cSAndroid Build Coastguard Worker   }
105*4d7e907cSAndroid Build Coastguard Worker 
106*4d7e907cSAndroid Build Coastguard Worker   // VSR API level is the minimum of vendor_api_level and product_api_level.
107*4d7e907cSAndroid Build Coastguard Worker   if (vendor_api_level == -1 || vendor_api_level > product_api_level) {
108*4d7e907cSAndroid Build Coastguard Worker     return product_api_level;
109*4d7e907cSAndroid Build Coastguard Worker   }
110*4d7e907cSAndroid Build Coastguard Worker   return vendor_api_level;
111*4d7e907cSAndroid Build Coastguard Worker }
112*4d7e907cSAndroid Build Coastguard Worker 
isTv()113*4d7e907cSAndroid Build Coastguard Worker static bool isTv() {
114*4d7e907cSAndroid Build Coastguard Worker   return testing::deviceSupportsFeature("android.software.leanback") ||
115*4d7e907cSAndroid Build Coastguard Worker          testing::deviceSupportsFeature("android.hardware.type.television");
116*4d7e907cSAndroid Build Coastguard Worker }
117*4d7e907cSAndroid Build Coastguard Worker 
isHandheld()118*4d7e907cSAndroid Build Coastguard Worker static bool isHandheld() {
119*4d7e907cSAndroid Build Coastguard Worker   return testing::deviceSupportsFeature("android.hardware.type.handheld");
120*4d7e907cSAndroid Build Coastguard Worker }
121*4d7e907cSAndroid Build Coastguard Worker 
122*4d7e907cSAndroid Build Coastguard Worker class ThroughputLogger {
123*4d7e907cSAndroid Build Coastguard Worker  public:
ThroughputLogger(std::string task)124*4d7e907cSAndroid Build Coastguard Worker   explicit ThroughputLogger(std::string task)
125*4d7e907cSAndroid Build Coastguard Worker       : total_bytes_(0),
126*4d7e907cSAndroid Build Coastguard Worker         task_(std::move(task)),
127*4d7e907cSAndroid Build Coastguard Worker         start_time_(std::chrono::steady_clock::now()) {}
128*4d7e907cSAndroid Build Coastguard Worker 
~ThroughputLogger()129*4d7e907cSAndroid Build Coastguard Worker   ~ThroughputLogger() {
130*4d7e907cSAndroid Build Coastguard Worker     if (total_bytes_ == 0) {
131*4d7e907cSAndroid Build Coastguard Worker       return;
132*4d7e907cSAndroid Build Coastguard Worker     }
133*4d7e907cSAndroid Build Coastguard Worker     std::chrono::duration<double> duration =
134*4d7e907cSAndroid Build Coastguard Worker         std::chrono::steady_clock::now() - start_time_;
135*4d7e907cSAndroid Build Coastguard Worker     double s = duration.count();
136*4d7e907cSAndroid Build Coastguard Worker     if (s == 0) {
137*4d7e907cSAndroid Build Coastguard Worker       return;
138*4d7e907cSAndroid Build Coastguard Worker     }
139*4d7e907cSAndroid Build Coastguard Worker     double rate_kb = (static_cast<double>(total_bytes_) / s) / 1024;
140*4d7e907cSAndroid Build Coastguard Worker     ALOGD("%s %.1f KB/s (%zu bytes in %.3fs)", task_.c_str(), rate_kb,
141*4d7e907cSAndroid Build Coastguard Worker           total_bytes_, s);
142*4d7e907cSAndroid Build Coastguard Worker   }
143*4d7e907cSAndroid Build Coastguard Worker 
setTotalBytes(size_t total_bytes)144*4d7e907cSAndroid Build Coastguard Worker   void setTotalBytes(size_t total_bytes) { total_bytes_ = total_bytes; }
145*4d7e907cSAndroid Build Coastguard Worker 
146*4d7e907cSAndroid Build Coastguard Worker  private:
147*4d7e907cSAndroid Build Coastguard Worker   size_t total_bytes_;
148*4d7e907cSAndroid Build Coastguard Worker   std::string task_;
149*4d7e907cSAndroid Build Coastguard Worker   std::chrono::steady_clock::time_point start_time_;
150*4d7e907cSAndroid Build Coastguard Worker };
151*4d7e907cSAndroid Build Coastguard Worker 
152*4d7e907cSAndroid Build Coastguard Worker // The main test class for Bluetooth HAL.
153*4d7e907cSAndroid Build Coastguard Worker class BluetoothAidlTest : public ::testing::TestWithParam<std::string> {
154*4d7e907cSAndroid Build Coastguard Worker   std::chrono::time_point<std::chrono::system_clock>
155*4d7e907cSAndroid Build Coastguard Worker       time_after_initialize_complete;
156*4d7e907cSAndroid Build Coastguard Worker 
157*4d7e907cSAndroid Build Coastguard Worker  public:
SetUp()158*4d7e907cSAndroid Build Coastguard Worker   void SetUp() override {
159*4d7e907cSAndroid Build Coastguard Worker     // currently test passthrough mode only
160*4d7e907cSAndroid Build Coastguard Worker     hci = IBluetoothHci::fromBinder(
161*4d7e907cSAndroid Build Coastguard Worker         SpAIBinder(AServiceManager_waitForService(GetParam().c_str())));
162*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(hci, nullptr);
163*4d7e907cSAndroid Build Coastguard Worker     ALOGI("%s: getService() for bluetooth hci is %s", __func__,
164*4d7e907cSAndroid Build Coastguard Worker           hci->isRemote() ? "remote" : "local");
165*4d7e907cSAndroid Build Coastguard Worker 
166*4d7e907cSAndroid Build Coastguard Worker     // Lambda function
167*4d7e907cSAndroid Build Coastguard Worker     auto on_binder_death = [](void* /*cookie*/) { FAIL(); };
168*4d7e907cSAndroid Build Coastguard Worker 
169*4d7e907cSAndroid Build Coastguard Worker     bluetooth_hci_death_recipient =
170*4d7e907cSAndroid Build Coastguard Worker         AIBinder_DeathRecipient_new(on_binder_death);
171*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(bluetooth_hci_death_recipient, nullptr);
172*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(STATUS_OK,
173*4d7e907cSAndroid Build Coastguard Worker               AIBinder_linkToDeath(hci->asBinder().get(),
174*4d7e907cSAndroid Build Coastguard Worker                                    bluetooth_hci_death_recipient, nullptr));
175*4d7e907cSAndroid Build Coastguard Worker 
176*4d7e907cSAndroid Build Coastguard Worker     hci_cb = ndk::SharedRefBase::make<BluetoothHciCallbacks>(*this);
177*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(hci_cb, nullptr);
178*4d7e907cSAndroid Build Coastguard Worker 
179*4d7e907cSAndroid Build Coastguard Worker     max_acl_data_packet_length = 0;
180*4d7e907cSAndroid Build Coastguard Worker     max_sco_data_packet_length = 0;
181*4d7e907cSAndroid Build Coastguard Worker     max_acl_data_packets = 0;
182*4d7e907cSAndroid Build Coastguard Worker     max_sco_data_packets = 0;
183*4d7e907cSAndroid Build Coastguard Worker 
184*4d7e907cSAndroid Build Coastguard Worker     event_cb_count = 0;
185*4d7e907cSAndroid Build Coastguard Worker     acl_cb_count = 0;
186*4d7e907cSAndroid Build Coastguard Worker     sco_cb_count = 0;
187*4d7e907cSAndroid Build Coastguard Worker     std::chrono::time_point<std::chrono::system_clock>
188*4d7e907cSAndroid Build Coastguard Worker         timeout_after_initialize =
189*4d7e907cSAndroid Build Coastguard Worker             std::chrono::system_clock::now() + kWaitForInitTimeout;
190*4d7e907cSAndroid Build Coastguard Worker 
191*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(hci->initialize(hci_cb).isOk());
192*4d7e907cSAndroid Build Coastguard Worker     auto future = initialized_promise.get_future();
193*4d7e907cSAndroid Build Coastguard Worker     auto timeout_status = future.wait_for(kWaitForInitTimeout);
194*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(timeout_status, std::future_status::ready);
195*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(future.get());
196*4d7e907cSAndroid Build Coastguard Worker     ASSERT_GE(timeout_after_initialize, time_after_initialize_complete);
197*4d7e907cSAndroid Build Coastguard Worker   }
198*4d7e907cSAndroid Build Coastguard Worker 
TearDown()199*4d7e907cSAndroid Build Coastguard Worker   void TearDown() override {
200*4d7e907cSAndroid Build Coastguard Worker     ALOGI("TearDown");
201*4d7e907cSAndroid Build Coastguard Worker     // Should not be checked in production code
202*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(hci->close().isOk());
203*4d7e907cSAndroid Build Coastguard Worker     std::this_thread::sleep_for(kInterfaceCloseDelayMs);
204*4d7e907cSAndroid Build Coastguard Worker     handle_no_ops();
205*4d7e907cSAndroid Build Coastguard Worker     discard_qca_debugging();
206*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(0), event_queue.size());
207*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(0), sco_queue.size());
208*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(0), acl_queue.size());
209*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(0), iso_queue.size());
210*4d7e907cSAndroid Build Coastguard Worker   }
211*4d7e907cSAndroid Build Coastguard Worker 
212*4d7e907cSAndroid Build Coastguard Worker   void setBufferSizes();
213*4d7e907cSAndroid Build Coastguard Worker   void setSynchronousFlowControlEnable();
214*4d7e907cSAndroid Build Coastguard Worker 
215*4d7e907cSAndroid Build Coastguard Worker   // Functions called from within tests in loopback mode
216*4d7e907cSAndroid Build Coastguard Worker   void sendAndCheckHci(int num_packets);
217*4d7e907cSAndroid Build Coastguard Worker   void sendAndCheckAcl(int num_packets, size_t size, uint16_t handle);
218*4d7e907cSAndroid Build Coastguard Worker 
219*4d7e907cSAndroid Build Coastguard Worker   // Helper functions to try to get a handle on verbosity
220*4d7e907cSAndroid Build Coastguard Worker   void enterLoopbackMode();
221*4d7e907cSAndroid Build Coastguard Worker   void handle_no_ops();
222*4d7e907cSAndroid Build Coastguard Worker   void discard_qca_debugging();
223*4d7e907cSAndroid Build Coastguard Worker   void wait_for_event(bool timeout_is_error);
224*4d7e907cSAndroid Build Coastguard Worker   void wait_for_command_complete_event(OpCode opCode,
225*4d7e907cSAndroid Build Coastguard Worker                                        std::vector<uint8_t>& complete_event);
226*4d7e907cSAndroid Build Coastguard Worker   // Wait until a command complete is received.
227*4d7e907cSAndroid Build Coastguard Worker   // Command complete will be consumed after this method
228*4d7e907cSAndroid Build Coastguard Worker   void wait_and_validate_command_complete_event(OpCode opCode);
229*4d7e907cSAndroid Build Coastguard Worker   int wait_for_completed_packets_event(uint16_t handle);
230*4d7e907cSAndroid Build Coastguard Worker   void send_and_wait_for_cmd_complete(std::unique_ptr<CommandBuilder> cmd,
231*4d7e907cSAndroid Build Coastguard Worker                                       std::vector<uint8_t>& cmd_complete);
232*4d7e907cSAndroid Build Coastguard Worker   void reassemble_sco_loopback_pkt(std::vector<uint8_t>& scoPackets,
233*4d7e907cSAndroid Build Coastguard Worker     size_t size);
234*4d7e907cSAndroid Build Coastguard Worker 
235*4d7e907cSAndroid Build Coastguard Worker   // A simple test implementation of BluetoothHciCallbacks.
236*4d7e907cSAndroid Build Coastguard Worker   class BluetoothHciCallbacks
237*4d7e907cSAndroid Build Coastguard Worker       : public aidl::android::hardware::bluetooth::BnBluetoothHciCallbacks {
238*4d7e907cSAndroid Build Coastguard Worker     BluetoothAidlTest& parent_;
239*4d7e907cSAndroid Build Coastguard Worker 
240*4d7e907cSAndroid Build Coastguard Worker    public:
BluetoothHciCallbacks(BluetoothAidlTest & parent)241*4d7e907cSAndroid Build Coastguard Worker     explicit BluetoothHciCallbacks(BluetoothAidlTest& parent)
242*4d7e907cSAndroid Build Coastguard Worker         : parent_(parent){};
243*4d7e907cSAndroid Build Coastguard Worker 
244*4d7e907cSAndroid Build Coastguard Worker     ~BluetoothHciCallbacks() override = default;
245*4d7e907cSAndroid Build Coastguard Worker 
initializationComplete(Status status)246*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus initializationComplete(Status status) override {
247*4d7e907cSAndroid Build Coastguard Worker       if (status == Status::SUCCESS) {
248*4d7e907cSAndroid Build Coastguard Worker         parent_.time_after_initialize_complete =
249*4d7e907cSAndroid Build Coastguard Worker             std::chrono::system_clock::now();
250*4d7e907cSAndroid Build Coastguard Worker       }
251*4d7e907cSAndroid Build Coastguard Worker       parent_.initialized_promise.set_value(status == Status::SUCCESS);
252*4d7e907cSAndroid Build Coastguard Worker       ALOGV("%s (status = %d)", __func__, static_cast<int>(status));
253*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
254*4d7e907cSAndroid Build Coastguard Worker     };
255*4d7e907cSAndroid Build Coastguard Worker 
hciEventReceived(const std::vector<uint8_t> & event)256*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus hciEventReceived(
257*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& event) override {
258*4d7e907cSAndroid Build Coastguard Worker       parent_.event_cb_count++;
259*4d7e907cSAndroid Build Coastguard Worker       parent_.event_queue.push(event);
260*4d7e907cSAndroid Build Coastguard Worker       ALOGI("Event received (length = %d)", static_cast<int>(event.size()));
261*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
262*4d7e907cSAndroid Build Coastguard Worker     };
263*4d7e907cSAndroid Build Coastguard Worker 
aclDataReceived(const std::vector<uint8_t> & data)264*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus aclDataReceived(
265*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& data) override {
266*4d7e907cSAndroid Build Coastguard Worker       parent_.acl_cb_count++;
267*4d7e907cSAndroid Build Coastguard Worker       parent_.acl_queue.push(data);
268*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
269*4d7e907cSAndroid Build Coastguard Worker     };
270*4d7e907cSAndroid Build Coastguard Worker 
scoDataReceived(const std::vector<uint8_t> & data)271*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus scoDataReceived(
272*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& data) override {
273*4d7e907cSAndroid Build Coastguard Worker       parent_.sco_cb_count++;
274*4d7e907cSAndroid Build Coastguard Worker       parent_.sco_queue.push(data);
275*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
276*4d7e907cSAndroid Build Coastguard Worker     };
277*4d7e907cSAndroid Build Coastguard Worker 
isoDataReceived(const std::vector<uint8_t> & data)278*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus isoDataReceived(
279*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& data) override {
280*4d7e907cSAndroid Build Coastguard Worker       parent_.iso_cb_count++;
281*4d7e907cSAndroid Build Coastguard Worker       parent_.iso_queue.push(data);
282*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
283*4d7e907cSAndroid Build Coastguard Worker     };
284*4d7e907cSAndroid Build Coastguard Worker   };
285*4d7e907cSAndroid Build Coastguard Worker 
286*4d7e907cSAndroid Build Coastguard Worker   template <class T>
287*4d7e907cSAndroid Build Coastguard Worker   class WaitQueue {
288*4d7e907cSAndroid Build Coastguard Worker    public:
289*4d7e907cSAndroid Build Coastguard Worker     WaitQueue() = default;
290*4d7e907cSAndroid Build Coastguard Worker     ;
291*4d7e907cSAndroid Build Coastguard Worker 
292*4d7e907cSAndroid Build Coastguard Worker     virtual ~WaitQueue() = default;
293*4d7e907cSAndroid Build Coastguard Worker 
empty() const294*4d7e907cSAndroid Build Coastguard Worker     bool empty() const {
295*4d7e907cSAndroid Build Coastguard Worker       std::lock_guard<std::mutex> lock(m_);
296*4d7e907cSAndroid Build Coastguard Worker       return q_.empty();
297*4d7e907cSAndroid Build Coastguard Worker     };
298*4d7e907cSAndroid Build Coastguard Worker 
size() const299*4d7e907cSAndroid Build Coastguard Worker     size_t size() const {
300*4d7e907cSAndroid Build Coastguard Worker       std::lock_guard<std::mutex> lock(m_);
301*4d7e907cSAndroid Build Coastguard Worker       return q_.size();
302*4d7e907cSAndroid Build Coastguard Worker     };
303*4d7e907cSAndroid Build Coastguard Worker 
push(const T & v)304*4d7e907cSAndroid Build Coastguard Worker     void push(const T& v) {
305*4d7e907cSAndroid Build Coastguard Worker       std::lock_guard<std::mutex> lock(m_);
306*4d7e907cSAndroid Build Coastguard Worker       q_.push(v);
307*4d7e907cSAndroid Build Coastguard Worker       ready_.notify_one();
308*4d7e907cSAndroid Build Coastguard Worker     };
309*4d7e907cSAndroid Build Coastguard Worker 
pop(T & v)310*4d7e907cSAndroid Build Coastguard Worker     bool pop(T& v) {
311*4d7e907cSAndroid Build Coastguard Worker       std::lock_guard<std::mutex> lock(m_);
312*4d7e907cSAndroid Build Coastguard Worker       if (q_.empty()) {
313*4d7e907cSAndroid Build Coastguard Worker         return false;
314*4d7e907cSAndroid Build Coastguard Worker       }
315*4d7e907cSAndroid Build Coastguard Worker       v = std::move(q_.front());
316*4d7e907cSAndroid Build Coastguard Worker       q_.pop();
317*4d7e907cSAndroid Build Coastguard Worker       return true;
318*4d7e907cSAndroid Build Coastguard Worker     };
319*4d7e907cSAndroid Build Coastguard Worker 
pop()320*4d7e907cSAndroid Build Coastguard Worker     void pop() {
321*4d7e907cSAndroid Build Coastguard Worker       std::lock_guard<std::mutex> lock(m_);
322*4d7e907cSAndroid Build Coastguard Worker       if (q_.empty()) {
323*4d7e907cSAndroid Build Coastguard Worker         return;
324*4d7e907cSAndroid Build Coastguard Worker       }
325*4d7e907cSAndroid Build Coastguard Worker       q_.pop();
326*4d7e907cSAndroid Build Coastguard Worker     };
327*4d7e907cSAndroid Build Coastguard Worker 
front(T & v)328*4d7e907cSAndroid Build Coastguard Worker     bool front(T& v) {
329*4d7e907cSAndroid Build Coastguard Worker       std::lock_guard<std::mutex> lock(m_);
330*4d7e907cSAndroid Build Coastguard Worker       if (q_.empty()) {
331*4d7e907cSAndroid Build Coastguard Worker         return false;
332*4d7e907cSAndroid Build Coastguard Worker       }
333*4d7e907cSAndroid Build Coastguard Worker       v = q_.front();
334*4d7e907cSAndroid Build Coastguard Worker       return true;
335*4d7e907cSAndroid Build Coastguard Worker     };
336*4d7e907cSAndroid Build Coastguard Worker 
wait()337*4d7e907cSAndroid Build Coastguard Worker     void wait() {
338*4d7e907cSAndroid Build Coastguard Worker       std::unique_lock<std::mutex> lock(m_);
339*4d7e907cSAndroid Build Coastguard Worker       while (q_.empty()) {
340*4d7e907cSAndroid Build Coastguard Worker         ready_.wait(lock);
341*4d7e907cSAndroid Build Coastguard Worker       }
342*4d7e907cSAndroid Build Coastguard Worker     };
343*4d7e907cSAndroid Build Coastguard Worker 
waitWithTimeout(std::chrono::milliseconds timeout)344*4d7e907cSAndroid Build Coastguard Worker     bool waitWithTimeout(std::chrono::milliseconds timeout) {
345*4d7e907cSAndroid Build Coastguard Worker       std::unique_lock<std::mutex> lock(m_);
346*4d7e907cSAndroid Build Coastguard Worker       while (q_.empty()) {
347*4d7e907cSAndroid Build Coastguard Worker         if (ready_.wait_for(lock, timeout) == std::cv_status::timeout) {
348*4d7e907cSAndroid Build Coastguard Worker           return false;
349*4d7e907cSAndroid Build Coastguard Worker         }
350*4d7e907cSAndroid Build Coastguard Worker       }
351*4d7e907cSAndroid Build Coastguard Worker       return true;
352*4d7e907cSAndroid Build Coastguard Worker     };
353*4d7e907cSAndroid Build Coastguard Worker 
tryPopWithTimeout(T & v,std::chrono::milliseconds timeout)354*4d7e907cSAndroid Build Coastguard Worker     bool tryPopWithTimeout(T& v, std::chrono::milliseconds timeout) {
355*4d7e907cSAndroid Build Coastguard Worker       std::unique_lock<std::mutex> lock(m_);
356*4d7e907cSAndroid Build Coastguard Worker       while (q_.empty()) {
357*4d7e907cSAndroid Build Coastguard Worker         if (ready_.wait_for(lock, timeout) == std::cv_status::timeout) {
358*4d7e907cSAndroid Build Coastguard Worker           return false;
359*4d7e907cSAndroid Build Coastguard Worker         }
360*4d7e907cSAndroid Build Coastguard Worker       }
361*4d7e907cSAndroid Build Coastguard Worker       v = std::move(q_.front());
362*4d7e907cSAndroid Build Coastguard Worker       q_.pop();
363*4d7e907cSAndroid Build Coastguard Worker       return true;
364*4d7e907cSAndroid Build Coastguard Worker     };
365*4d7e907cSAndroid Build Coastguard Worker 
366*4d7e907cSAndroid Build Coastguard Worker    private:
367*4d7e907cSAndroid Build Coastguard Worker     mutable std::mutex m_;
368*4d7e907cSAndroid Build Coastguard Worker     std::queue<T> q_;
369*4d7e907cSAndroid Build Coastguard Worker     std::condition_variable_any ready_;
370*4d7e907cSAndroid Build Coastguard Worker   };
371*4d7e907cSAndroid Build Coastguard Worker 
372*4d7e907cSAndroid Build Coastguard Worker   std::shared_ptr<IBluetoothHci> hci;
373*4d7e907cSAndroid Build Coastguard Worker   std::shared_ptr<BluetoothHciCallbacks> hci_cb;
374*4d7e907cSAndroid Build Coastguard Worker   AIBinder_DeathRecipient* bluetooth_hci_death_recipient{};
375*4d7e907cSAndroid Build Coastguard Worker   WaitQueue<std::vector<uint8_t>> event_queue;
376*4d7e907cSAndroid Build Coastguard Worker   WaitQueue<std::vector<uint8_t>> acl_queue;
377*4d7e907cSAndroid Build Coastguard Worker   WaitQueue<std::vector<uint8_t>> sco_queue;
378*4d7e907cSAndroid Build Coastguard Worker   WaitQueue<std::vector<uint8_t>> iso_queue;
379*4d7e907cSAndroid Build Coastguard Worker 
380*4d7e907cSAndroid Build Coastguard Worker   std::promise<bool> initialized_promise;
381*4d7e907cSAndroid Build Coastguard Worker   int event_cb_count{};
382*4d7e907cSAndroid Build Coastguard Worker   int sco_cb_count{};
383*4d7e907cSAndroid Build Coastguard Worker   int acl_cb_count{};
384*4d7e907cSAndroid Build Coastguard Worker   int iso_cb_count{};
385*4d7e907cSAndroid Build Coastguard Worker 
386*4d7e907cSAndroid Build Coastguard Worker   int max_acl_data_packet_length{};
387*4d7e907cSAndroid Build Coastguard Worker   int max_sco_data_packet_length{};
388*4d7e907cSAndroid Build Coastguard Worker   int max_acl_data_packets{};
389*4d7e907cSAndroid Build Coastguard Worker   int max_sco_data_packets{};
390*4d7e907cSAndroid Build Coastguard Worker 
391*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint16_t> sco_connection_handles;
392*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint16_t> acl_connection_handles;
393*4d7e907cSAndroid Build Coastguard Worker };
394*4d7e907cSAndroid Build Coastguard Worker 
395*4d7e907cSAndroid Build Coastguard Worker // Discard NO-OPs from the event queue.
handle_no_ops()396*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::handle_no_ops() {
397*4d7e907cSAndroid Build Coastguard Worker   while (!event_queue.empty()) {
398*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> event;
399*4d7e907cSAndroid Build Coastguard Worker     event_queue.front(event);
400*4d7e907cSAndroid Build Coastguard Worker     auto complete_view = ::bluetooth::hci::CommandCompleteView::Create(
401*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
402*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<std::vector<uint8_t>>(event))));
403*4d7e907cSAndroid Build Coastguard Worker     auto status_view = ::bluetooth::hci::CommandCompleteView::Create(
404*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
405*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<std::vector<uint8_t>>(event))));
406*4d7e907cSAndroid Build Coastguard Worker     bool is_complete_no_op =
407*4d7e907cSAndroid Build Coastguard Worker         complete_view.IsValid() &&
408*4d7e907cSAndroid Build Coastguard Worker         complete_view.GetCommandOpCode() == ::bluetooth::hci::OpCode::NONE;
409*4d7e907cSAndroid Build Coastguard Worker     bool is_status_no_op =
410*4d7e907cSAndroid Build Coastguard Worker         status_view.IsValid() &&
411*4d7e907cSAndroid Build Coastguard Worker         status_view.GetCommandOpCode() == ::bluetooth::hci::OpCode::NONE;
412*4d7e907cSAndroid Build Coastguard Worker     if (is_complete_no_op || is_status_no_op) {
413*4d7e907cSAndroid Build Coastguard Worker       event_queue.pop();
414*4d7e907cSAndroid Build Coastguard Worker     } else {
415*4d7e907cSAndroid Build Coastguard Worker       break;
416*4d7e907cSAndroid Build Coastguard Worker     }
417*4d7e907cSAndroid Build Coastguard Worker   }
418*4d7e907cSAndroid Build Coastguard Worker }
419*4d7e907cSAndroid Build Coastguard Worker 
420*4d7e907cSAndroid Build Coastguard Worker // Discard Qualcomm ACL debugging
discard_qca_debugging()421*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::discard_qca_debugging() {
422*4d7e907cSAndroid Build Coastguard Worker   while (!acl_queue.empty()) {
423*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> acl_packet;
424*4d7e907cSAndroid Build Coastguard Worker     acl_queue.front(acl_packet);
425*4d7e907cSAndroid Build Coastguard Worker     auto acl_view =
426*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::AclView::Create(::bluetooth::hci::PacketView<true>(
427*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<std::vector<uint8_t>>(acl_packet)));
428*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(acl_view.IsValid());
429*4d7e907cSAndroid Build Coastguard Worker     if (acl_view.GetHandle() == kAclHandleQcaDebugMessage) {
430*4d7e907cSAndroid Build Coastguard Worker       acl_queue.pop();
431*4d7e907cSAndroid Build Coastguard Worker     } else {
432*4d7e907cSAndroid Build Coastguard Worker       break;
433*4d7e907cSAndroid Build Coastguard Worker     }
434*4d7e907cSAndroid Build Coastguard Worker   }
435*4d7e907cSAndroid Build Coastguard Worker }
436*4d7e907cSAndroid Build Coastguard Worker 
437*4d7e907cSAndroid Build Coastguard Worker // Receive an event, discarding NO-OPs.
wait_for_event(bool timeout_is_error=true)438*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::wait_for_event(bool timeout_is_error = true) {
439*4d7e907cSAndroid Build Coastguard Worker   // Wait until we get something that's not a no-op.
440*4d7e907cSAndroid Build Coastguard Worker   while (true) {
441*4d7e907cSAndroid Build Coastguard Worker     bool event_ready = event_queue.waitWithTimeout(kWaitForHciEventTimeout);
442*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(event_ready || !timeout_is_error);
443*4d7e907cSAndroid Build Coastguard Worker     if (event_queue.empty()) {
444*4d7e907cSAndroid Build Coastguard Worker       // waitWithTimeout timed out
445*4d7e907cSAndroid Build Coastguard Worker       return;
446*4d7e907cSAndroid Build Coastguard Worker     }
447*4d7e907cSAndroid Build Coastguard Worker     handle_no_ops();
448*4d7e907cSAndroid Build Coastguard Worker     if (!event_queue.empty()) {
449*4d7e907cSAndroid Build Coastguard Worker       // There's an event in the queue that's not a no-op.
450*4d7e907cSAndroid Build Coastguard Worker       return;
451*4d7e907cSAndroid Build Coastguard Worker     }
452*4d7e907cSAndroid Build Coastguard Worker   }
453*4d7e907cSAndroid Build Coastguard Worker }
454*4d7e907cSAndroid Build Coastguard Worker 
wait_for_command_complete_event(OpCode opCode,std::vector<uint8_t> & complete_event)455*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::wait_for_command_complete_event(
456*4d7e907cSAndroid Build Coastguard Worker     OpCode opCode, std::vector<uint8_t>& complete_event) {
457*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(wait_for_event());
458*4d7e907cSAndroid Build Coastguard Worker   ASSERT_FALSE(event_queue.empty());
459*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(event_queue.pop(complete_event));
460*4d7e907cSAndroid Build Coastguard Worker   auto complete_view = ::bluetooth::hci::CommandCompleteView::Create(
461*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
462*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(complete_event))));
463*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(complete_view.IsValid());
464*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(complete_view.GetCommandOpCode(), opCode);
465*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(complete_view.GetPayload()[0],
466*4d7e907cSAndroid Build Coastguard Worker             static_cast<uint8_t>(::bluetooth::hci::ErrorCode::SUCCESS));
467*4d7e907cSAndroid Build Coastguard Worker }
468*4d7e907cSAndroid Build Coastguard Worker 
wait_and_validate_command_complete_event(::bluetooth::hci::OpCode opCode)469*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::wait_and_validate_command_complete_event(
470*4d7e907cSAndroid Build Coastguard Worker     ::bluetooth::hci::OpCode opCode) {
471*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> complete_event;
472*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
473*4d7e907cSAndroid Build Coastguard Worker       wait_for_command_complete_event(opCode, complete_event));
474*4d7e907cSAndroid Build Coastguard Worker }
475*4d7e907cSAndroid Build Coastguard Worker 
476*4d7e907cSAndroid Build Coastguard Worker // Send the command to read the controller's buffer sizes.
setBufferSizes()477*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::setBufferSizes() {
478*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
479*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
480*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::ReadBufferSizeBuilder::Create()->Serialize(bi);
481*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
482*4d7e907cSAndroid Build Coastguard Worker 
483*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(wait_for_event());
484*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> event;
485*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(event_queue.pop(event));
486*4d7e907cSAndroid Build Coastguard Worker   auto complete_view = ::bluetooth::hci::ReadBufferSizeCompleteView::Create(
487*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::CommandCompleteView::Create(
488*4d7e907cSAndroid Build Coastguard Worker           ::bluetooth::hci::EventView::Create(
489*4d7e907cSAndroid Build Coastguard Worker               ::bluetooth::hci::PacketView<true>(
490*4d7e907cSAndroid Build Coastguard Worker                   std::make_shared<std::vector<uint8_t>>(event)))));
491*4d7e907cSAndroid Build Coastguard Worker 
492*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(complete_view.IsValid());
493*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(complete_view.GetStatus(), ::bluetooth::hci::ErrorCode::SUCCESS);
494*4d7e907cSAndroid Build Coastguard Worker   max_acl_data_packet_length = complete_view.GetAclDataPacketLength();
495*4d7e907cSAndroid Build Coastguard Worker   max_sco_data_packet_length = complete_view.GetSynchronousDataPacketLength();
496*4d7e907cSAndroid Build Coastguard Worker   max_acl_data_packets = complete_view.GetTotalNumAclDataPackets();
497*4d7e907cSAndroid Build Coastguard Worker   max_sco_data_packets = complete_view.GetTotalNumSynchronousDataPackets();
498*4d7e907cSAndroid Build Coastguard Worker 
499*4d7e907cSAndroid Build Coastguard Worker   ALOGD("%s: ACL max %d num %d SCO max %d num %d", __func__,
500*4d7e907cSAndroid Build Coastguard Worker         static_cast<int>(max_acl_data_packet_length),
501*4d7e907cSAndroid Build Coastguard Worker         static_cast<int>(max_acl_data_packets),
502*4d7e907cSAndroid Build Coastguard Worker         static_cast<int>(max_sco_data_packet_length),
503*4d7e907cSAndroid Build Coastguard Worker         static_cast<int>(max_sco_data_packets));
504*4d7e907cSAndroid Build Coastguard Worker }
505*4d7e907cSAndroid Build Coastguard Worker 
506*4d7e907cSAndroid Build Coastguard Worker // Enable flow control packets for SCO
setSynchronousFlowControlEnable()507*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::setSynchronousFlowControlEnable() {
508*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
509*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
510*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::WriteSynchronousFlowControlEnableBuilder::Create(
511*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::Enable::ENABLED)
512*4d7e907cSAndroid Build Coastguard Worker       ->Serialize(bi);
513*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
514*4d7e907cSAndroid Build Coastguard Worker 
515*4d7e907cSAndroid Build Coastguard Worker   wait_and_validate_command_complete_event(
516*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::OpCode::WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE);
517*4d7e907cSAndroid Build Coastguard Worker }
518*4d7e907cSAndroid Build Coastguard Worker 
519*4d7e907cSAndroid Build Coastguard Worker // Send an HCI command (in Loopback mode) and check the response.
sendAndCheckHci(int num_packets)520*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::sendAndCheckHci(int num_packets) {
521*4d7e907cSAndroid Build Coastguard Worker   ThroughputLogger logger{__func__};
522*4d7e907cSAndroid Build Coastguard Worker   size_t command_size = 0;
523*4d7e907cSAndroid Build Coastguard Worker   char new_name[] = "John Jacob Jingleheimer Schmidt ___________________";
524*4d7e907cSAndroid Build Coastguard Worker   size_t new_name_length = strlen(new_name);
525*4d7e907cSAndroid Build Coastguard Worker   for (int n = 0; n < num_packets; n++) {
526*4d7e907cSAndroid Build Coastguard Worker     // The name to set is new_name
527*4d7e907cSAndroid Build Coastguard Worker     std::array<uint8_t, 248> name_array{};
528*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < new_name_length; i++) {
529*4d7e907cSAndroid Build Coastguard Worker       name_array[i] = new_name[i];
530*4d7e907cSAndroid Build Coastguard Worker     }
531*4d7e907cSAndroid Build Coastguard Worker     // And the packet number
532*4d7e907cSAndroid Build Coastguard Worker     char number[11] = "0000000000";
533*4d7e907cSAndroid Build Coastguard Worker     snprintf(number, sizeof(number), "%010d", static_cast<int>(n));
534*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = new_name_length; i < new_name_length + sizeof(number) - 1;
535*4d7e907cSAndroid Build Coastguard Worker          i++) {
536*4d7e907cSAndroid Build Coastguard Worker       name_array[new_name_length + i] = number[i];
537*4d7e907cSAndroid Build Coastguard Worker     }
538*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> write_name;
539*4d7e907cSAndroid Build Coastguard Worker     ::bluetooth::packet::BitInserter bi{write_name};
540*4d7e907cSAndroid Build Coastguard Worker     ::bluetooth::hci::WriteLocalNameBuilder::Create(name_array)->Serialize(bi);
541*4d7e907cSAndroid Build Coastguard Worker     hci->sendHciCommand(write_name);
542*4d7e907cSAndroid Build Coastguard Worker 
543*4d7e907cSAndroid Build Coastguard Worker     // Check the loopback of the HCI packet
544*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(wait_for_event());
545*4d7e907cSAndroid Build Coastguard Worker 
546*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> event;
547*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(event_queue.pop(event));
548*4d7e907cSAndroid Build Coastguard Worker     auto event_view = ::bluetooth::hci::LoopbackCommandView::Create(
549*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
550*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<std::vector<uint8_t>>(event))));
551*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(event_view.IsValid());
552*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> looped_back_command{event_view.GetPayload().begin(),
553*4d7e907cSAndroid Build Coastguard Worker                                              event_view.GetPayload().end()};
554*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(looped_back_command, write_name);
555*4d7e907cSAndroid Build Coastguard Worker 
556*4d7e907cSAndroid Build Coastguard Worker     if (n == num_packets - 1) {
557*4d7e907cSAndroid Build Coastguard Worker       command_size = write_name.size();
558*4d7e907cSAndroid Build Coastguard Worker     }
559*4d7e907cSAndroid Build Coastguard Worker   }
560*4d7e907cSAndroid Build Coastguard Worker   logger.setTotalBytes(command_size * num_packets * 2);
561*4d7e907cSAndroid Build Coastguard Worker }
562*4d7e907cSAndroid Build Coastguard Worker 
563*4d7e907cSAndroid Build Coastguard Worker // Send an ACL data packet (in Loopback mode) and check the response.
sendAndCheckAcl(int num_packets,size_t size,uint16_t handle)564*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::sendAndCheckAcl(int num_packets, size_t size,
565*4d7e907cSAndroid Build Coastguard Worker                                         uint16_t handle) {
566*4d7e907cSAndroid Build Coastguard Worker   ThroughputLogger logger{__func__};
567*4d7e907cSAndroid Build Coastguard Worker   for (int n = 0; n < num_packets; n++) {
568*4d7e907cSAndroid Build Coastguard Worker     // Send an ACL packet with counting data
569*4d7e907cSAndroid Build Coastguard Worker     auto payload = std::make_unique<::bluetooth::packet::RawBuilder>();
570*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < size; i++) {
571*4d7e907cSAndroid Build Coastguard Worker       payload->AddOctets1(static_cast<uint8_t>(i + n));
572*4d7e907cSAndroid Build Coastguard Worker     }
573*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> acl_packet;
574*4d7e907cSAndroid Build Coastguard Worker     ::bluetooth::packet::BitInserter bi{acl_packet};
575*4d7e907cSAndroid Build Coastguard Worker     ::bluetooth::hci::AclBuilder::Create(
576*4d7e907cSAndroid Build Coastguard Worker         handle,
577*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::PacketBoundaryFlag::FIRST_AUTOMATICALLY_FLUSHABLE,
578*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::BroadcastFlag::POINT_TO_POINT, std::move(payload))
579*4d7e907cSAndroid Build Coastguard Worker         ->Serialize(bi);
580*4d7e907cSAndroid Build Coastguard Worker     hci->sendAclData(acl_packet);
581*4d7e907cSAndroid Build Coastguard Worker 
582*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> acl_loopback;
583*4d7e907cSAndroid Build Coastguard Worker     // Check the loopback of the ACL packet
584*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(
585*4d7e907cSAndroid Build Coastguard Worker         acl_queue.tryPopWithTimeout(acl_loopback, kWaitForAclDataTimeout));
586*4d7e907cSAndroid Build Coastguard Worker 
587*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(acl_packet, acl_loopback);
588*4d7e907cSAndroid Build Coastguard Worker   }
589*4d7e907cSAndroid Build Coastguard Worker   logger.setTotalBytes(num_packets * size * 2);
590*4d7e907cSAndroid Build Coastguard Worker }
591*4d7e907cSAndroid Build Coastguard Worker 
592*4d7e907cSAndroid Build Coastguard Worker // Return the number of completed packets reported by the controller.
wait_for_completed_packets_event(uint16_t handle)593*4d7e907cSAndroid Build Coastguard Worker int BluetoothAidlTest::wait_for_completed_packets_event(uint16_t handle) {
594*4d7e907cSAndroid Build Coastguard Worker   int packets_processed = 0;
595*4d7e907cSAndroid Build Coastguard Worker   while (true) {
596*4d7e907cSAndroid Build Coastguard Worker     // There should be at least one event.
597*4d7e907cSAndroid Build Coastguard Worker     wait_for_event(packets_processed == 0);
598*4d7e907cSAndroid Build Coastguard Worker     if (event_queue.empty()) {
599*4d7e907cSAndroid Build Coastguard Worker       if (packets_processed == 0) {
600*4d7e907cSAndroid Build Coastguard Worker         ALOGW("%s: waitForBluetoothCallback timed out.", __func__);
601*4d7e907cSAndroid Build Coastguard Worker       }
602*4d7e907cSAndroid Build Coastguard Worker       return packets_processed;
603*4d7e907cSAndroid Build Coastguard Worker     }
604*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> event;
605*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(event_queue.pop(event));
606*4d7e907cSAndroid Build Coastguard Worker     auto event_view = ::bluetooth::hci::NumberOfCompletedPacketsView::Create(
607*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
608*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<std::vector<uint8_t>>(event))));
609*4d7e907cSAndroid Build Coastguard Worker     if (!event_view.IsValid()) {
610*4d7e907cSAndroid Build Coastguard Worker       ADD_FAILURE();
611*4d7e907cSAndroid Build Coastguard Worker       return packets_processed;
612*4d7e907cSAndroid Build Coastguard Worker     }
613*4d7e907cSAndroid Build Coastguard Worker     auto completed_packets = event_view.GetCompletedPackets();
614*4d7e907cSAndroid Build Coastguard Worker     for (const auto& entry : completed_packets) {
615*4d7e907cSAndroid Build Coastguard Worker       EXPECT_EQ(handle, entry.connection_handle_);
616*4d7e907cSAndroid Build Coastguard Worker       packets_processed += entry.host_num_of_completed_packets_;
617*4d7e907cSAndroid Build Coastguard Worker     }
618*4d7e907cSAndroid Build Coastguard Worker   }
619*4d7e907cSAndroid Build Coastguard Worker   return packets_processed;
620*4d7e907cSAndroid Build Coastguard Worker }
621*4d7e907cSAndroid Build Coastguard Worker 
622*4d7e907cSAndroid Build Coastguard Worker // Send local loopback command and initialize SCO and ACL handles.
enterLoopbackMode()623*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::enterLoopbackMode() {
624*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
625*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
626*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::WriteLoopbackModeBuilder::Create(
627*4d7e907cSAndroid Build Coastguard Worker       bluetooth::hci::LoopbackMode::ENABLE_LOCAL)
628*4d7e907cSAndroid Build Coastguard Worker       ->Serialize(bi);
629*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
630*4d7e907cSAndroid Build Coastguard Worker 
631*4d7e907cSAndroid Build Coastguard Worker   // Receive connection complete events with data channels
632*4d7e907cSAndroid Build Coastguard Worker   int connection_event_count = 0;
633*4d7e907cSAndroid Build Coastguard Worker   bool command_complete_received = false;
634*4d7e907cSAndroid Build Coastguard Worker   while (true) {
635*4d7e907cSAndroid Build Coastguard Worker     wait_for_event(false);
636*4d7e907cSAndroid Build Coastguard Worker     if (event_queue.empty()) {
637*4d7e907cSAndroid Build Coastguard Worker       // Fail if there was no event received or no connections completed.
638*4d7e907cSAndroid Build Coastguard Worker       ASSERT_TRUE(command_complete_received);
639*4d7e907cSAndroid Build Coastguard Worker       ASSERT_LT(0, connection_event_count);
640*4d7e907cSAndroid Build Coastguard Worker       return;
641*4d7e907cSAndroid Build Coastguard Worker     }
642*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> event;
643*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(event_queue.pop(event));
644*4d7e907cSAndroid Build Coastguard Worker     auto event_view =
645*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
646*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<std::vector<uint8_t>>(event)));
647*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(event_view.IsValid());
648*4d7e907cSAndroid Build Coastguard Worker 
649*4d7e907cSAndroid Build Coastguard Worker     if (event_view.GetEventCode() ==
650*4d7e907cSAndroid Build Coastguard Worker         ::bluetooth::hci::EventCode::CONNECTION_COMPLETE) {
651*4d7e907cSAndroid Build Coastguard Worker       auto complete_view =
652*4d7e907cSAndroid Build Coastguard Worker           ::bluetooth::hci::ConnectionCompleteView::Create(event_view);
653*4d7e907cSAndroid Build Coastguard Worker       ASSERT_TRUE(complete_view.IsValid());
654*4d7e907cSAndroid Build Coastguard Worker       switch (complete_view.GetLinkType()) {
655*4d7e907cSAndroid Build Coastguard Worker         case ::bluetooth::hci::LinkType::ACL:
656*4d7e907cSAndroid Build Coastguard Worker           acl_connection_handles.push_back(complete_view.GetConnectionHandle());
657*4d7e907cSAndroid Build Coastguard Worker           break;
658*4d7e907cSAndroid Build Coastguard Worker         case ::bluetooth::hci::LinkType::SCO:
659*4d7e907cSAndroid Build Coastguard Worker           sco_connection_handles.push_back(complete_view.GetConnectionHandle());
660*4d7e907cSAndroid Build Coastguard Worker           break;
661*4d7e907cSAndroid Build Coastguard Worker         default:
662*4d7e907cSAndroid Build Coastguard Worker           ASSERT_EQ(complete_view.GetLinkType(),
663*4d7e907cSAndroid Build Coastguard Worker                     ::bluetooth::hci::LinkType::ACL);
664*4d7e907cSAndroid Build Coastguard Worker       }
665*4d7e907cSAndroid Build Coastguard Worker       connection_event_count++;
666*4d7e907cSAndroid Build Coastguard Worker     } else {
667*4d7e907cSAndroid Build Coastguard Worker       auto command_complete_view =
668*4d7e907cSAndroid Build Coastguard Worker           ::bluetooth::hci::WriteLoopbackModeCompleteView::Create(
669*4d7e907cSAndroid Build Coastguard Worker               ::bluetooth::hci::CommandCompleteView::Create(event_view));
670*4d7e907cSAndroid Build Coastguard Worker       ASSERT_TRUE(command_complete_view.IsValid());
671*4d7e907cSAndroid Build Coastguard Worker       ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS,
672*4d7e907cSAndroid Build Coastguard Worker                 command_complete_view.GetStatus());
673*4d7e907cSAndroid Build Coastguard Worker       command_complete_received = true;
674*4d7e907cSAndroid Build Coastguard Worker     }
675*4d7e907cSAndroid Build Coastguard Worker   }
676*4d7e907cSAndroid Build Coastguard Worker }
677*4d7e907cSAndroid Build Coastguard Worker 
send_and_wait_for_cmd_complete(std::unique_ptr<CommandBuilder> cmd,std::vector<uint8_t> & cmd_complete)678*4d7e907cSAndroid Build Coastguard Worker void BluetoothAidlTest::send_and_wait_for_cmd_complete(
679*4d7e907cSAndroid Build Coastguard Worker     std::unique_ptr<CommandBuilder> cmd, std::vector<uint8_t>& cmd_complete) {
680*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd_bytes = cmd->SerializeToBytes();
681*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd_bytes);
682*4d7e907cSAndroid Build Coastguard Worker 
683*4d7e907cSAndroid Build Coastguard Worker   auto view = CommandView::Create(
684*4d7e907cSAndroid Build Coastguard Worker       PacketView<true>(std::make_shared<std::vector<uint8_t>>(cmd_bytes)));
685*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(view.IsValid());
686*4d7e907cSAndroid Build Coastguard Worker   ALOGI("Waiting for %s[0x%x]", OpCodeText(view.GetOpCode()).c_str(),
687*4d7e907cSAndroid Build Coastguard Worker         static_cast<int>(view.GetOpCode()));
688*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
689*4d7e907cSAndroid Build Coastguard Worker       wait_for_command_complete_event(view.GetOpCode(), cmd_complete));
690*4d7e907cSAndroid Build Coastguard Worker }
691*4d7e907cSAndroid Build Coastguard Worker 
692*4d7e907cSAndroid Build Coastguard Worker // Empty test: Initialize()/Close() are called in SetUp()/TearDown().
TEST_P(BluetoothAidlTest,InitializeAndClose)693*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, InitializeAndClose) {}
694*4d7e907cSAndroid Build Coastguard Worker 
695*4d7e907cSAndroid Build Coastguard Worker // Send an HCI Reset with sendHciCommand and wait for a command complete event.
TEST_P(BluetoothAidlTest,HciReset)696*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, HciReset) {
697*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> reset;
698*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{reset};
699*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::ResetBuilder::Create()->Serialize(bi);
700*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(reset);
701*4d7e907cSAndroid Build Coastguard Worker 
702*4d7e907cSAndroid Build Coastguard Worker   wait_and_validate_command_complete_event(::bluetooth::hci::OpCode::RESET);
703*4d7e907cSAndroid Build Coastguard Worker }
704*4d7e907cSAndroid Build Coastguard Worker 
705*4d7e907cSAndroid Build Coastguard Worker // Read and check the HCI version of the controller.
TEST_P(BluetoothAidlTest,HciVersionTest)706*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, HciVersionTest) {
707*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
708*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
709*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::ReadLocalVersionInformationBuilder::Create()->Serialize(bi);
710*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
711*4d7e907cSAndroid Build Coastguard Worker 
712*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(wait_for_event());
713*4d7e907cSAndroid Build Coastguard Worker 
714*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> event;
715*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(event_queue.pop(event));
716*4d7e907cSAndroid Build Coastguard Worker   auto complete_view =
717*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::ReadLocalVersionInformationCompleteView::Create(
718*4d7e907cSAndroid Build Coastguard Worker           ::bluetooth::hci::CommandCompleteView::Create(
719*4d7e907cSAndroid Build Coastguard Worker               ::bluetooth::hci::EventView::Create(
720*4d7e907cSAndroid Build Coastguard Worker                   ::bluetooth::hci::PacketView<true>(
721*4d7e907cSAndroid Build Coastguard Worker                       std::make_shared<std::vector<uint8_t>>(event)))));
722*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(complete_view.IsValid());
723*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, complete_view.GetStatus());
724*4d7e907cSAndroid Build Coastguard Worker   auto version = complete_view.GetLocalVersionInformation();
725*4d7e907cSAndroid Build Coastguard Worker   ASSERT_LE(::bluetooth::hci::HciVersion::V_3_0, version.hci_version_);
726*4d7e907cSAndroid Build Coastguard Worker   ASSERT_LE(::bluetooth::hci::LmpVersion::V_3_0, version.lmp_version_);
727*4d7e907cSAndroid Build Coastguard Worker }
728*4d7e907cSAndroid Build Coastguard Worker 
729*4d7e907cSAndroid Build Coastguard Worker // Send an unknown HCI command and wait for the error message.
TEST_P(BluetoothAidlTest,HciUnknownCommand)730*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, HciUnknownCommand) {
731*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
732*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
733*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::CommandBuilder::Create(
734*4d7e907cSAndroid Build Coastguard Worker       static_cast<::bluetooth::hci::OpCode>(0x3cff),
735*4d7e907cSAndroid Build Coastguard Worker       std::make_unique<::bluetooth::packet::RawBuilder>())
736*4d7e907cSAndroid Build Coastguard Worker       ->Serialize(bi);
737*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
738*4d7e907cSAndroid Build Coastguard Worker 
739*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(wait_for_event());
740*4d7e907cSAndroid Build Coastguard Worker 
741*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> event;
742*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(event_queue.pop(event));
743*4d7e907cSAndroid Build Coastguard Worker   auto event_view =
744*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::EventView::Create(::bluetooth::hci::PacketView<true>(
745*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(event)));
746*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(event_view.IsValid());
747*4d7e907cSAndroid Build Coastguard Worker 
748*4d7e907cSAndroid Build Coastguard Worker   switch (event_view.GetEventCode()) {
749*4d7e907cSAndroid Build Coastguard Worker     case ::bluetooth::hci::EventCode::COMMAND_COMPLETE: {
750*4d7e907cSAndroid Build Coastguard Worker       auto command_complete =
751*4d7e907cSAndroid Build Coastguard Worker           ::bluetooth::hci::CommandCompleteView::Create(event_view);
752*4d7e907cSAndroid Build Coastguard Worker       ASSERT_TRUE(command_complete.IsValid());
753*4d7e907cSAndroid Build Coastguard Worker       ASSERT_EQ(command_complete.GetPayload()[0],
754*4d7e907cSAndroid Build Coastguard Worker                 static_cast<uint8_t>(
755*4d7e907cSAndroid Build Coastguard Worker                     ::bluetooth::hci::ErrorCode::UNKNOWN_HCI_COMMAND));
756*4d7e907cSAndroid Build Coastguard Worker     } break;
757*4d7e907cSAndroid Build Coastguard Worker     case ::bluetooth::hci::EventCode::COMMAND_STATUS: {
758*4d7e907cSAndroid Build Coastguard Worker       auto command_status =
759*4d7e907cSAndroid Build Coastguard Worker           ::bluetooth::hci::CommandStatusView::Create(event_view);
760*4d7e907cSAndroid Build Coastguard Worker       ASSERT_TRUE(command_status.IsValid());
761*4d7e907cSAndroid Build Coastguard Worker       ASSERT_EQ(command_status.GetStatus(),
762*4d7e907cSAndroid Build Coastguard Worker                 ::bluetooth::hci::ErrorCode::UNKNOWN_HCI_COMMAND);
763*4d7e907cSAndroid Build Coastguard Worker     } break;
764*4d7e907cSAndroid Build Coastguard Worker     default:
765*4d7e907cSAndroid Build Coastguard Worker       ADD_FAILURE();
766*4d7e907cSAndroid Build Coastguard Worker   }
767*4d7e907cSAndroid Build Coastguard Worker }
768*4d7e907cSAndroid Build Coastguard Worker 
769*4d7e907cSAndroid Build Coastguard Worker // Enter loopback mode, but don't send any packets.
TEST_P(BluetoothAidlTest,WriteLoopbackMode)770*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, WriteLoopbackMode) { enterLoopbackMode(); }
771*4d7e907cSAndroid Build Coastguard Worker 
772*4d7e907cSAndroid Build Coastguard Worker // Enter loopback mode and send a single command.
TEST_P(BluetoothAidlTest,LoopbackModeSingleCommand)773*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, LoopbackModeSingleCommand) {
774*4d7e907cSAndroid Build Coastguard Worker   setBufferSizes();
775*4d7e907cSAndroid Build Coastguard Worker 
776*4d7e907cSAndroid Build Coastguard Worker   enterLoopbackMode();
777*4d7e907cSAndroid Build Coastguard Worker 
778*4d7e907cSAndroid Build Coastguard Worker   sendAndCheckHci(1);
779*4d7e907cSAndroid Build Coastguard Worker }
780*4d7e907cSAndroid Build Coastguard Worker 
781*4d7e907cSAndroid Build Coastguard Worker // Enter loopback mode and send a single ACL packet.
TEST_P(BluetoothAidlTest,LoopbackModeSingleAcl)782*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, LoopbackModeSingleAcl) {
783*4d7e907cSAndroid Build Coastguard Worker   setBufferSizes();
784*4d7e907cSAndroid Build Coastguard Worker 
785*4d7e907cSAndroid Build Coastguard Worker   enterLoopbackMode();
786*4d7e907cSAndroid Build Coastguard Worker 
787*4d7e907cSAndroid Build Coastguard Worker   if (!acl_connection_handles.empty()) {
788*4d7e907cSAndroid Build Coastguard Worker     ASSERT_LT(0, max_acl_data_packet_length);
789*4d7e907cSAndroid Build Coastguard Worker     sendAndCheckAcl(1, max_acl_data_packet_length - 1,
790*4d7e907cSAndroid Build Coastguard Worker                     acl_connection_handles[0]);
791*4d7e907cSAndroid Build Coastguard Worker     int acl_packets_sent = 1;
792*4d7e907cSAndroid Build Coastguard Worker     int completed_packets =
793*4d7e907cSAndroid Build Coastguard Worker         wait_for_completed_packets_event(acl_connection_handles[0]);
794*4d7e907cSAndroid Build Coastguard Worker     if (acl_packets_sent != completed_packets) {
795*4d7e907cSAndroid Build Coastguard Worker       ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__,
796*4d7e907cSAndroid Build Coastguard Worker             acl_packets_sent, completed_packets);
797*4d7e907cSAndroid Build Coastguard Worker     }
798*4d7e907cSAndroid Build Coastguard Worker   }
799*4d7e907cSAndroid Build Coastguard Worker   ASSERT_GE(acl_cb_count, 1);
800*4d7e907cSAndroid Build Coastguard Worker }
801*4d7e907cSAndroid Build Coastguard Worker 
802*4d7e907cSAndroid Build Coastguard Worker // Enter loopback mode and send command packets for bandwidth measurements.
TEST_P(BluetoothAidlTest,LoopbackModeCommandBandwidth)803*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, LoopbackModeCommandBandwidth) {
804*4d7e907cSAndroid Build Coastguard Worker   setBufferSizes();
805*4d7e907cSAndroid Build Coastguard Worker 
806*4d7e907cSAndroid Build Coastguard Worker   enterLoopbackMode();
807*4d7e907cSAndroid Build Coastguard Worker 
808*4d7e907cSAndroid Build Coastguard Worker   sendAndCheckHci(kNumHciCommandsBandwidth);
809*4d7e907cSAndroid Build Coastguard Worker }
810*4d7e907cSAndroid Build Coastguard Worker 
811*4d7e907cSAndroid Build Coastguard Worker // Enter loopback mode and send packets for ACL bandwidth measurements.
TEST_P(BluetoothAidlTest,LoopbackModeAclBandwidth)812*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, LoopbackModeAclBandwidth) {
813*4d7e907cSAndroid Build Coastguard Worker   setBufferSizes();
814*4d7e907cSAndroid Build Coastguard Worker 
815*4d7e907cSAndroid Build Coastguard Worker   enterLoopbackMode();
816*4d7e907cSAndroid Build Coastguard Worker 
817*4d7e907cSAndroid Build Coastguard Worker   if (!acl_connection_handles.empty()) {
818*4d7e907cSAndroid Build Coastguard Worker     ASSERT_LT(0, max_acl_data_packet_length);
819*4d7e907cSAndroid Build Coastguard Worker     sendAndCheckAcl(kNumAclPacketsBandwidth, max_acl_data_packet_length - 1,
820*4d7e907cSAndroid Build Coastguard Worker                     acl_connection_handles[0]);
821*4d7e907cSAndroid Build Coastguard Worker     int acl_packets_sent = kNumAclPacketsBandwidth;
822*4d7e907cSAndroid Build Coastguard Worker     int completed_packets =
823*4d7e907cSAndroid Build Coastguard Worker         wait_for_completed_packets_event(acl_connection_handles[0]);
824*4d7e907cSAndroid Build Coastguard Worker     if (acl_packets_sent != completed_packets) {
825*4d7e907cSAndroid Build Coastguard Worker       ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__,
826*4d7e907cSAndroid Build Coastguard Worker             acl_packets_sent, completed_packets);
827*4d7e907cSAndroid Build Coastguard Worker     }
828*4d7e907cSAndroid Build Coastguard Worker   }
829*4d7e907cSAndroid Build Coastguard Worker }
830*4d7e907cSAndroid Build Coastguard Worker 
831*4d7e907cSAndroid Build Coastguard Worker // Set all bits in the event mask
TEST_P(BluetoothAidlTest,SetEventMask)832*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, SetEventMask) {
833*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
834*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
835*4d7e907cSAndroid Build Coastguard Worker   uint64_t full_mask = UINT64_MAX;
836*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::SetEventMaskBuilder::Create(full_mask)->Serialize(bi);
837*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
838*4d7e907cSAndroid Build Coastguard Worker   wait_and_validate_command_complete_event(
839*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::OpCode::SET_EVENT_MASK);
840*4d7e907cSAndroid Build Coastguard Worker }
841*4d7e907cSAndroid Build Coastguard Worker 
842*4d7e907cSAndroid Build Coastguard Worker // Set all bits in the LE event mask
TEST_P(BluetoothAidlTest,SetLeEventMask)843*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, SetLeEventMask) {
844*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> cmd;
845*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::packet::BitInserter bi{cmd};
846*4d7e907cSAndroid Build Coastguard Worker   uint64_t full_mask = UINT64_MAX;
847*4d7e907cSAndroid Build Coastguard Worker   ::bluetooth::hci::LeSetEventMaskBuilder::Create(full_mask)->Serialize(bi);
848*4d7e907cSAndroid Build Coastguard Worker   hci->sendHciCommand(cmd);
849*4d7e907cSAndroid Build Coastguard Worker   wait_and_validate_command_complete_event(
850*4d7e907cSAndroid Build Coastguard Worker       ::bluetooth::hci::OpCode::LE_SET_EVENT_MASK);
851*4d7e907cSAndroid Build Coastguard Worker }
852*4d7e907cSAndroid Build Coastguard Worker 
853*4d7e907cSAndroid Build Coastguard Worker // Call initialize twice, second one should fail.
TEST_P(BluetoothAidlTest,CallInitializeTwice)854*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, CallInitializeTwice) {
855*4d7e907cSAndroid Build Coastguard Worker   class SecondCb
856*4d7e907cSAndroid Build Coastguard Worker       : public aidl::android::hardware::bluetooth::BnBluetoothHciCallbacks {
857*4d7e907cSAndroid Build Coastguard Worker    public:
858*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus initializationComplete(Status status) override {
859*4d7e907cSAndroid Build Coastguard Worker       EXPECT_EQ(status, Status::ALREADY_INITIALIZED);
860*4d7e907cSAndroid Build Coastguard Worker       init_promise.set_value();
861*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
862*4d7e907cSAndroid Build Coastguard Worker     };
863*4d7e907cSAndroid Build Coastguard Worker 
864*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus hciEventReceived(
865*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& /*event*/) override {
866*4d7e907cSAndroid Build Coastguard Worker       ADD_FAILURE();
867*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
868*4d7e907cSAndroid Build Coastguard Worker     };
869*4d7e907cSAndroid Build Coastguard Worker 
870*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus aclDataReceived(
871*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& /*data*/) override {
872*4d7e907cSAndroid Build Coastguard Worker       ADD_FAILURE();
873*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
874*4d7e907cSAndroid Build Coastguard Worker     };
875*4d7e907cSAndroid Build Coastguard Worker 
876*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus scoDataReceived(
877*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& /*data*/) override {
878*4d7e907cSAndroid Build Coastguard Worker       ADD_FAILURE();
879*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
880*4d7e907cSAndroid Build Coastguard Worker     };
881*4d7e907cSAndroid Build Coastguard Worker 
882*4d7e907cSAndroid Build Coastguard Worker     ndk::ScopedAStatus isoDataReceived(
883*4d7e907cSAndroid Build Coastguard Worker         const std::vector<uint8_t>& /*data*/) override {
884*4d7e907cSAndroid Build Coastguard Worker       ADD_FAILURE();
885*4d7e907cSAndroid Build Coastguard Worker       return ScopedAStatus::ok();
886*4d7e907cSAndroid Build Coastguard Worker     };
887*4d7e907cSAndroid Build Coastguard Worker     std::promise<void> init_promise;
888*4d7e907cSAndroid Build Coastguard Worker   };
889*4d7e907cSAndroid Build Coastguard Worker 
890*4d7e907cSAndroid Build Coastguard Worker   std::shared_ptr<SecondCb> second_cb = ndk::SharedRefBase::make<SecondCb>();
891*4d7e907cSAndroid Build Coastguard Worker   ASSERT_NE(second_cb, nullptr);
892*4d7e907cSAndroid Build Coastguard Worker 
893*4d7e907cSAndroid Build Coastguard Worker   auto future = second_cb->init_promise.get_future();
894*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(hci->initialize(second_cb).isOk());
895*4d7e907cSAndroid Build Coastguard Worker   auto status = future.wait_for(std::chrono::seconds(1));
896*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(status, std::future_status::ready);
897*4d7e907cSAndroid Build Coastguard Worker }
898*4d7e907cSAndroid Build Coastguard Worker 
899*4d7e907cSAndroid Build Coastguard Worker // @VsrTest = 5.3.14-001
900*4d7e907cSAndroid Build Coastguard Worker // @VsrTest = 5.3.14-002
901*4d7e907cSAndroid Build Coastguard Worker // @VsrTest = 5.3.14-004
TEST_P(BluetoothAidlTest,Vsr_Bluetooth5Requirements)902*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, Vsr_Bluetooth5Requirements) {
903*4d7e907cSAndroid Build Coastguard Worker   int api_level = get_vsr_api_level();
904*4d7e907cSAndroid Build Coastguard Worker   if (api_level < __ANDROID_API_U__) {
905*4d7e907cSAndroid Build Coastguard Worker     GTEST_SKIP() << "API level is lower than 34";
906*4d7e907cSAndroid Build Coastguard Worker     return;
907*4d7e907cSAndroid Build Coastguard Worker   }
908*4d7e907cSAndroid Build Coastguard Worker 
909*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> version_event;
910*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(ReadLocalVersionInformationBuilder::Create(),
911*4d7e907cSAndroid Build Coastguard Worker                                  version_event);
912*4d7e907cSAndroid Build Coastguard Worker   auto version_view = ReadLocalVersionInformationCompleteView::Create(
913*4d7e907cSAndroid Build Coastguard Worker       CommandCompleteView::Create(EventView::Create(PacketView<true>(
914*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(version_event)))));
915*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(version_view.IsValid());
916*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, version_view.GetStatus());
917*4d7e907cSAndroid Build Coastguard Worker   auto version = version_view.GetLocalVersionInformation();
918*4d7e907cSAndroid Build Coastguard Worker 
919*4d7e907cSAndroid Build Coastguard Worker   if (version.hci_version_ < ::bluetooth::hci::HciVersion::V_5_0) {
920*4d7e907cSAndroid Build Coastguard Worker     GTEST_SKIP() << "Bluetooth version is lower than 5.0";
921*4d7e907cSAndroid Build Coastguard Worker     return;
922*4d7e907cSAndroid Build Coastguard Worker   }
923*4d7e907cSAndroid Build Coastguard Worker 
924*4d7e907cSAndroid Build Coastguard Worker   // When HCI version is 5.0, LMP version must also be at least 5.0
925*4d7e907cSAndroid Build Coastguard Worker   ASSERT_GE(static_cast<int>(version.lmp_version_),
926*4d7e907cSAndroid Build Coastguard Worker             static_cast<int>(version.hci_version_));
927*4d7e907cSAndroid Build Coastguard Worker 
928*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> le_features_event;
929*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(LeReadLocalSupportedFeaturesBuilder::Create(),
930*4d7e907cSAndroid Build Coastguard Worker                                  le_features_event);
931*4d7e907cSAndroid Build Coastguard Worker   auto le_features_view = LeReadLocalSupportedFeaturesCompleteView::Create(
932*4d7e907cSAndroid Build Coastguard Worker       CommandCompleteView::Create(EventView::Create(PacketView<true>(
933*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(le_features_event)))));
934*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features_view.IsValid());
935*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, le_features_view.GetStatus());
936*4d7e907cSAndroid Build Coastguard Worker 
937*4d7e907cSAndroid Build Coastguard Worker   // CHIPSETs that set ro.board.api_level to 34 and report 5.0 or higher for
938*4d7e907cSAndroid Build Coastguard Worker   // the Bluetooth version through the IBluetoothHci HAL:
939*4d7e907cSAndroid Build Coastguard Worker   //
940*4d7e907cSAndroid Build Coastguard Worker   // [VSR-5.3.14-001] Must return TRUE for
941*4d7e907cSAndroid Build Coastguard Worker   //   - LE 2M PHY
942*4d7e907cSAndroid Build Coastguard Worker   //   - LE Coded PHY
943*4d7e907cSAndroid Build Coastguard Worker   //   - LE Advertising Extension
944*4d7e907cSAndroid Build Coastguard Worker   //   - LE Periodic Advertising
945*4d7e907cSAndroid Build Coastguard Worker   //   - LE Link Layer Privacy
946*4d7e907cSAndroid Build Coastguard Worker   auto le_features = le_features_view.GetLeFeatures();
947*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features & static_cast<uint64_t>(LLFeaturesBits::LL_PRIVACY));
948*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features & static_cast<uint64_t>(LLFeaturesBits::LE_2M_PHY));
949*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features &
950*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(LLFeaturesBits::LE_CODED_PHY));
951*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features &
952*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(LLFeaturesBits::LE_EXTENDED_ADVERTISING));
953*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features &
954*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(LLFeaturesBits::LE_PERIODIC_ADVERTISING));
955*4d7e907cSAndroid Build Coastguard Worker 
956*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> num_adv_set_event;
957*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(
958*4d7e907cSAndroid Build Coastguard Worker       LeReadNumberOfSupportedAdvertisingSetsBuilder::Create(),
959*4d7e907cSAndroid Build Coastguard Worker       num_adv_set_event);
960*4d7e907cSAndroid Build Coastguard Worker   auto num_adv_set_view =
961*4d7e907cSAndroid Build Coastguard Worker       LeReadNumberOfSupportedAdvertisingSetsCompleteView::Create(
962*4d7e907cSAndroid Build Coastguard Worker           CommandCompleteView::Create(EventView::Create(PacketView<true>(
963*4d7e907cSAndroid Build Coastguard Worker               std::make_shared<std::vector<uint8_t>>(num_adv_set_event)))));
964*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(num_adv_set_view.IsValid());
965*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, num_adv_set_view.GetStatus());
966*4d7e907cSAndroid Build Coastguard Worker   auto num_adv_set = num_adv_set_view.GetNumberSupportedAdvertisingSets();
967*4d7e907cSAndroid Build Coastguard Worker 
968*4d7e907cSAndroid Build Coastguard Worker   // CHIPSETs that set ro.board.api_level to 34 and report 5.0 or higher for
969*4d7e907cSAndroid Build Coastguard Worker   // the Bluetooth version through the IBluetoothHci HAL:
970*4d7e907cSAndroid Build Coastguard Worker   //
971*4d7e907cSAndroid Build Coastguard Worker   // [VSR-5.3.14-002] MUST support at least 10 advertising sets.
972*4d7e907cSAndroid Build Coastguard Worker   if (isTv() && get_vsr_api_level() == __ANDROID_API_U__) {
973*4d7e907cSAndroid Build Coastguard Worker     ASSERT_GE(num_adv_set, kMinLeAdvSetForBt5ForTv);
974*4d7e907cSAndroid Build Coastguard Worker   } else {
975*4d7e907cSAndroid Build Coastguard Worker     ASSERT_GE(num_adv_set, kMinLeAdvSetForBt5);
976*4d7e907cSAndroid Build Coastguard Worker   }
977*4d7e907cSAndroid Build Coastguard Worker 
978*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> num_resolving_list_event;
979*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(LeReadResolvingListSizeBuilder::Create(),
980*4d7e907cSAndroid Build Coastguard Worker                                  num_resolving_list_event);
981*4d7e907cSAndroid Build Coastguard Worker   auto num_resolving_list_view = LeReadResolvingListSizeCompleteView::Create(
982*4d7e907cSAndroid Build Coastguard Worker       CommandCompleteView::Create(EventView::Create(PacketView<true>(
983*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(num_resolving_list_event)))));
984*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(num_resolving_list_view.IsValid());
985*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS,
986*4d7e907cSAndroid Build Coastguard Worker             num_resolving_list_view.GetStatus());
987*4d7e907cSAndroid Build Coastguard Worker   auto num_resolving_list = num_resolving_list_view.GetResolvingListSize();
988*4d7e907cSAndroid Build Coastguard Worker 
989*4d7e907cSAndroid Build Coastguard Worker   // CHIPSETs that set ro.board.api_level to 34 and report 5.0 or higher for
990*4d7e907cSAndroid Build Coastguard Worker   // the Bluetooth version through the IBluetoothHci HAL:
991*4d7e907cSAndroid Build Coastguard Worker   //
992*4d7e907cSAndroid Build Coastguard Worker   // [VSR-5.3.14-004] MUST support a resolving list size of at least 8 entries.
993*4d7e907cSAndroid Build Coastguard Worker   ASSERT_GE(num_resolving_list, kMinLeResolvingListForBt5);
994*4d7e907cSAndroid Build Coastguard Worker }
995*4d7e907cSAndroid Build Coastguard Worker 
996*4d7e907cSAndroid Build Coastguard Worker /**
997*4d7e907cSAndroid Build Coastguard Worker  * VSR-5.3.14-007 MUST support Bluetooth 4.2 and Bluetooth LE Data Length Extension.
998*4d7e907cSAndroid Build Coastguard Worker  * VSR-5.3.14-008 MUST support Bluetooth Low Energy (BLE).
999*4d7e907cSAndroid Build Coastguard Worker  */
1000*4d7e907cSAndroid Build Coastguard Worker // @VsrTest = 5.3.14-007
1001*4d7e907cSAndroid Build Coastguard Worker // @VsrTest = 5.3.14-008
TEST_P(BluetoothAidlTest,Vsr_Bluetooth4_2Requirements)1002*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, Vsr_Bluetooth4_2Requirements) {
1003*4d7e907cSAndroid Build Coastguard Worker   // test only applies to handheld devices
1004*4d7e907cSAndroid Build Coastguard Worker   if (!isHandheld()) {
1005*4d7e907cSAndroid Build Coastguard Worker     return;
1006*4d7e907cSAndroid Build Coastguard Worker   }
1007*4d7e907cSAndroid Build Coastguard Worker 
1008*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> version_event;
1009*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(ReadLocalVersionInformationBuilder::Create(),
1010*4d7e907cSAndroid Build Coastguard Worker                                  version_event);
1011*4d7e907cSAndroid Build Coastguard Worker   auto version_view = ReadLocalVersionInformationCompleteView::Create(
1012*4d7e907cSAndroid Build Coastguard Worker       CommandCompleteView::Create(EventView::Create(PacketView<true>(
1013*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(version_event)))));
1014*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(version_view.IsValid());
1015*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, version_view.GetStatus());
1016*4d7e907cSAndroid Build Coastguard Worker   auto version = version_view.GetLocalVersionInformation();
1017*4d7e907cSAndroid Build Coastguard Worker   // Starting with Android 15, Fails when HCI version is lower than 4.2.
1018*4d7e907cSAndroid Build Coastguard Worker   ASSERT_GE(static_cast<int>(version.hci_version_),
1019*4d7e907cSAndroid Build Coastguard Worker     static_cast<int>(::bluetooth::hci::HciVersion::V_4_2));
1020*4d7e907cSAndroid Build Coastguard Worker   ASSERT_GE(static_cast<int>(version.lmp_version_),
1021*4d7e907cSAndroid Build Coastguard Worker     static_cast<int>(::bluetooth::hci::LmpVersion::V_4_2));
1022*4d7e907cSAndroid Build Coastguard Worker 
1023*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> le_features_event;
1024*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(LeReadLocalSupportedFeaturesBuilder::Create(),
1025*4d7e907cSAndroid Build Coastguard Worker                                  le_features_event);
1026*4d7e907cSAndroid Build Coastguard Worker   auto le_features_view = LeReadLocalSupportedFeaturesCompleteView::Create(
1027*4d7e907cSAndroid Build Coastguard Worker       CommandCompleteView::Create(EventView::Create(PacketView<true>(
1028*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(le_features_event)))));
1029*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features_view.IsValid());
1030*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, le_features_view.GetStatus());
1031*4d7e907cSAndroid Build Coastguard Worker   auto le_features = le_features_view.GetLeFeatures();
1032*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(le_features &
1033*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(LLFeaturesBits::LE_EXTENDED_ADVERTISING));
1034*4d7e907cSAndroid Build Coastguard Worker 
1035*4d7e907cSAndroid Build Coastguard Worker }
1036*4d7e907cSAndroid Build Coastguard Worker 
1037*4d7e907cSAndroid Build Coastguard Worker /**
1038*4d7e907cSAndroid Build Coastguard Worker  * VSR-5.3.14-012 MUST support at least eight LE concurrent connections with
1039*4d7e907cSAndroid Build Coastguard Worker  *                three in peripheral role.
1040*4d7e907cSAndroid Build Coastguard Worker  */
1041*4d7e907cSAndroid Build Coastguard Worker // @VsrTest = 5.3.14-012
TEST_P(BluetoothAidlTest,Vsr_BlE_Connection_Requirement)1042*4d7e907cSAndroid Build Coastguard Worker TEST_P(BluetoothAidlTest, Vsr_BlE_Connection_Requirement) {
1043*4d7e907cSAndroid Build Coastguard Worker   std::vector<uint8_t> version_event;
1044*4d7e907cSAndroid Build Coastguard Worker   send_and_wait_for_cmd_complete(ReadLocalVersionInformationBuilder::Create(),
1045*4d7e907cSAndroid Build Coastguard Worker                                  version_event);
1046*4d7e907cSAndroid Build Coastguard Worker   auto version_view = ReadLocalVersionInformationCompleteView::Create(
1047*4d7e907cSAndroid Build Coastguard Worker       CommandCompleteView::Create(EventView::Create(PacketView<true>(
1048*4d7e907cSAndroid Build Coastguard Worker           std::make_shared<std::vector<uint8_t>>(version_event)))));
1049*4d7e907cSAndroid Build Coastguard Worker   ASSERT_TRUE(version_view.IsValid());
1050*4d7e907cSAndroid Build Coastguard Worker   ASSERT_EQ(::bluetooth::hci::ErrorCode::SUCCESS, version_view.GetStatus());
1051*4d7e907cSAndroid Build Coastguard Worker   auto version = version_view.GetLocalVersionInformation();
1052*4d7e907cSAndroid Build Coastguard Worker   if (version.hci_version_ < ::bluetooth::hci::HciVersion::V_5_0) {
1053*4d7e907cSAndroid Build Coastguard Worker     // This test does not apply to controllers below 5.0
1054*4d7e907cSAndroid Build Coastguard Worker     return;
1055*4d7e907cSAndroid Build Coastguard Worker   };
1056*4d7e907cSAndroid Build Coastguard Worker 
1057*4d7e907cSAndroid Build Coastguard Worker   int max_connections = ::android::base::GetIntProperty(
1058*4d7e907cSAndroid Build Coastguard Worker       "bluetooth.core.le.max_number_of_concurrent_connections", -1);
1059*4d7e907cSAndroid Build Coastguard Worker   if (max_connections == -1) {
1060*4d7e907cSAndroid Build Coastguard Worker     // With the property not set the default minimum of 8 will be used
1061*4d7e907cSAndroid Build Coastguard Worker     ALOGI("Max number of LE concurrent connections isn't set");
1062*4d7e907cSAndroid Build Coastguard Worker     return;
1063*4d7e907cSAndroid Build Coastguard Worker   }
1064*4d7e907cSAndroid Build Coastguard Worker   ALOGI("Max number of LE concurrent connections = %d", max_connections);
1065*4d7e907cSAndroid Build Coastguard Worker   ASSERT_GE(max_connections, 8);
1066*4d7e907cSAndroid Build Coastguard Worker }
1067*4d7e907cSAndroid Build Coastguard Worker 
1068*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BluetoothAidlTest);
1069*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(PerInstance, BluetoothAidlTest,
1070*4d7e907cSAndroid Build Coastguard Worker                          testing::ValuesIn(android::getAidlHalInstanceNames(
1071*4d7e907cSAndroid Build Coastguard Worker                              IBluetoothHci::descriptor)),
1072*4d7e907cSAndroid Build Coastguard Worker                          android::PrintInstanceNameToString);
1073*4d7e907cSAndroid Build Coastguard Worker 
main(int argc,char ** argv)1074*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
1075*4d7e907cSAndroid Build Coastguard Worker   ABinderProcess_startThreadPool();
1076*4d7e907cSAndroid Build Coastguard Worker   ::testing::InitGoogleTest(&argc, argv);
1077*4d7e907cSAndroid Build Coastguard Worker   int status = RUN_ALL_TESTS();
1078*4d7e907cSAndroid Build Coastguard Worker   ALOGI("Test result = %d", status);
1079*4d7e907cSAndroid Build Coastguard Worker   return status;
1080*4d7e907cSAndroid Build Coastguard Worker }
1081