• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "hci/controller.h"
18 
19 #include <gtest/gtest.h>
20 
21 #include <algorithm>
22 #include <chrono>
23 #include <future>
24 #include <map>
25 #include <memory>
26 
27 #include "common/bind.h"
28 #include "common/callback.h"
29 #include "common/init_flags.h"
30 #include "hci/address.h"
31 #include "hci/hci_layer.h"
32 #include "os/thread.h"
33 #include "packet/raw_builder.h"
34 
35 using namespace bluetooth;
36 using namespace std::chrono_literals;
37 
38 using common::BidiQueue;
39 using common::BidiQueueEnd;
40 using packet::kLittleEndian;
41 using packet::PacketView;
42 using packet::RawBuilder;
43 
44 namespace bluetooth {
45 namespace hci {
46 
47 namespace {
48 
49 constexpr uint16_t kHandle1 = 0x123;
50 constexpr uint16_t kCredits1 = 0x78;
51 constexpr uint16_t kHandle2 = 0x456;
52 constexpr uint16_t kCredits2 = 0x9a;
53 constexpr uint64_t kRandomNumber = 0x123456789abcdef0;
54 uint16_t feature_spec_version = 55;
55 constexpr char title[] = "hci_controller_test";
56 
GetPacketView(std::unique_ptr<packet::BasePacketBuilder> packet)57 PacketView<kLittleEndian> GetPacketView(std::unique_ptr<packet::BasePacketBuilder> packet) {
58   auto bytes = std::make_shared<std::vector<uint8_t>>();
59   BitInserter i(*bytes);
60   bytes->reserve(packet->size());
61   packet->Serialize(i);
62   return packet::PacketView<packet::kLittleEndian>(bytes);
63 }
64 
65 }  // namespace
66 
67 namespace {
68 
69 class TestHciLayer : public HciLayer {
70  public:
EnqueueCommand(std::unique_ptr<CommandBuilder> command,common::ContextualOnceCallback<void (CommandCompleteView)> on_complete)71   void EnqueueCommand(
72       std::unique_ptr<CommandBuilder> command,
73       common::ContextualOnceCallback<void(CommandCompleteView)> on_complete) override {
74     GetHandler()->Post(common::BindOnce(
75         &TestHciLayer::HandleCommand, common::Unretained(this), std::move(command), std::move(on_complete)));
76   }
77 
EnqueueCommand(std::unique_ptr<CommandBuilder> command,common::ContextualOnceCallback<void (CommandStatusView)> on_status)78   void EnqueueCommand(
79       std::unique_ptr<CommandBuilder> command,
80       common::ContextualOnceCallback<void(CommandStatusView)> on_status) override {
81     FAIL() << "Controller properties should not generate Command Status";
82   }
83 
HandleCommand(std::unique_ptr<CommandBuilder> command_builder,common::ContextualOnceCallback<void (CommandCompleteView)> on_complete)84   void HandleCommand(
85       std::unique_ptr<CommandBuilder> command_builder,
86       common::ContextualOnceCallback<void(CommandCompleteView)> on_complete) {
87     auto packet_view = GetPacketView(std::move(command_builder));
88     CommandView command = CommandView::Create(packet_view);
89     ASSERT_TRUE(command.IsValid());
90 
91     uint8_t num_packets = 1;
92     std::unique_ptr<packet::BasePacketBuilder> event_builder;
93     switch (command.GetOpCode()) {
94       case (OpCode::READ_LOCAL_NAME): {
95         std::array<uint8_t, 248> local_name = {'D', 'U', 'T', '\0'};
96         event_builder = ReadLocalNameCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, local_name);
97       } break;
98       case (OpCode::READ_LOCAL_VERSION_INFORMATION): {
99         LocalVersionInformation local_version_information;
100         local_version_information.hci_version_ = HciVersion::V_5_0;
101         local_version_information.hci_revision_ = 0x1234;
102         local_version_information.lmp_version_ = LmpVersion::V_4_2;
103         local_version_information.manufacturer_name_ = 0xBAD;
104         local_version_information.lmp_subversion_ = 0x5678;
105         event_builder = ReadLocalVersionInformationCompleteBuilder::Create(
106             num_packets, ErrorCode::SUCCESS, local_version_information);
107       } break;
108       case (OpCode::READ_LOCAL_SUPPORTED_COMMANDS): {
109         std::array<uint8_t, 64> supported_commands;
110         for (int i = 0; i < 37; i++) {
111           supported_commands[i] = 0xff;
112         }
113         for (int i = 37; i < 64; i++) {
114           supported_commands[i] = 0x00;
115         }
116         event_builder =
117             ReadLocalSupportedCommandsCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, supported_commands);
118       } break;
119       case (OpCode::READ_LOCAL_EXTENDED_FEATURES): {
120         ReadLocalExtendedFeaturesView read_command = ReadLocalExtendedFeaturesView::Create(command);
121         ASSERT_TRUE(read_command.IsValid());
122         uint8_t page_bumber = read_command.GetPageNumber();
123         uint64_t lmp_features = 0x012345678abcdef;
124         lmp_features += page_bumber;
125         event_builder = ReadLocalExtendedFeaturesCompleteBuilder::Create(
126             num_packets, ErrorCode::SUCCESS, page_bumber, 0x02, lmp_features);
127       } break;
128       case (OpCode::READ_BUFFER_SIZE): {
129         event_builder = ReadBufferSizeCompleteBuilder::Create(
130             num_packets,
131             ErrorCode::SUCCESS,
132             acl_data_packet_length,
133             synchronous_data_packet_length,
134             total_num_acl_data_packets,
135             total_num_synchronous_data_packets);
136       } break;
137       case (OpCode::READ_BD_ADDR): {
138         event_builder = ReadBdAddrCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, Address::kAny);
139       } break;
140       case (OpCode::LE_READ_BUFFER_SIZE_V1): {
141         LeBufferSize le_buffer_size;
142         le_buffer_size.le_data_packet_length_ = 0x16;
143         le_buffer_size.total_num_le_packets_ = 0x08;
144         event_builder = LeReadBufferSizeV1CompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, le_buffer_size);
145       } break;
146       case (OpCode::LE_READ_LOCAL_SUPPORTED_FEATURES): {
147         event_builder =
148             LeReadLocalSupportedFeaturesCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, 0x001f123456789abc);
149       } break;
150       case (OpCode::LE_READ_SUPPORTED_STATES): {
151         event_builder =
152             LeReadSupportedStatesCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, 0x001f123456789abe);
153       } break;
154       case (OpCode::LE_READ_MAXIMUM_DATA_LENGTH): {
155         LeMaximumDataLength le_maximum_data_length;
156         le_maximum_data_length.supported_max_tx_octets_ = 0x12;
157         le_maximum_data_length.supported_max_tx_time_ = 0x34;
158         le_maximum_data_length.supported_max_rx_octets_ = 0x56;
159         le_maximum_data_length.supported_max_rx_time_ = 0x78;
160         event_builder =
161             LeReadMaximumDataLengthCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, le_maximum_data_length);
162       } break;
163       case (OpCode::LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH): {
164         event_builder =
165             LeReadMaximumAdvertisingDataLengthCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, 0x0672);
166       } break;
167       case (OpCode::LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS): {
168         event_builder =
169             LeReadNumberOfSupportedAdvertisingSetsCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, 0xF0);
170       } break;
171       case (OpCode::LE_GET_VENDOR_CAPABILITIES): {
172         BaseVendorCapabilities base_vendor_capabilities;
173         base_vendor_capabilities.max_advt_instances_ = 0x10;
174         base_vendor_capabilities.offloaded_resolution_of_private_address_ = 0x01;
175         base_vendor_capabilities.total_scan_results_storage_ = 0x2800;
176         base_vendor_capabilities.max_irk_list_sz_ = 0x20;
177         base_vendor_capabilities.filtering_support_ = 0x01;
178         base_vendor_capabilities.max_filter_ = 0x10;
179         base_vendor_capabilities.activity_energy_info_support_ = 0x01;
180 
181         auto payload = std::make_unique<RawBuilder>();
182         if (feature_spec_version > 55) {
183           std::vector<uint8_t> payload_bytes = {0x20, 0x00, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00};
184           payload->AddOctets2(feature_spec_version);
185           payload->AddOctets(payload_bytes);
186         }
187         event_builder = LeGetVendorCapabilitiesCompleteBuilder::Create(
188             num_packets, ErrorCode::SUCCESS, base_vendor_capabilities, std::move(payload));
189       } break;
190       case (OpCode::SET_EVENT_MASK): {
191         auto view = SetEventMaskView::Create(command);
192         ASSERT_TRUE(view.IsValid());
193         event_mask = view.GetEventMask();
194         event_builder = SetEventMaskCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS);
195       } break;
196       case (OpCode::LE_SET_EVENT_MASK): {
197         auto view = LeSetEventMaskView::Create(command);
198         ASSERT_TRUE(view.IsValid());
199         le_event_mask = view.GetLeEventMask();
200         event_builder = LeSetEventMaskCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS);
201       } break;
202 
203       case (OpCode::LE_RAND): {
204         auto view = LeRandView::Create(LeSecurityCommandView::Create(command));
205         ASSERT_TRUE(view.IsValid());
206         event_builder = LeRandCompleteBuilder::Create(num_packets, ErrorCode::SUCCESS, kRandomNumber);
207       } break;
208 
209       case (OpCode::RESET):
210       case (OpCode::SET_EVENT_FILTER):
211       case (OpCode::HOST_BUFFER_SIZE):
212         command_queue_.push(command);
213         not_empty_.notify_all();
214         return;
215       default:
216         LOG_INFO("Dropping unhandled packet");
217         return;
218     }
219     auto packet = GetPacketView(std::move(event_builder));
220     EventView event = EventView::Create(packet);
221     ASSERT_TRUE(event.IsValid());
222     CommandCompleteView command_complete = CommandCompleteView::Create(event);
223     ASSERT_TRUE(command_complete.IsValid());
224     on_complete.Invoke(std::move(command_complete));
225   }
226 
RegisterEventHandler(EventCode event_code,common::ContextualCallback<void (EventView)> event_handler)227   void RegisterEventHandler(EventCode event_code, common::ContextualCallback<void(EventView)> event_handler) override {
228     ASSERT_EQ(event_code, EventCode::NUMBER_OF_COMPLETED_PACKETS) << "Only NUMBER_OF_COMPLETED_PACKETS is needed";
229     number_of_completed_packets_callback_ = event_handler;
230   }
231 
UnregisterEventHandler(EventCode event_code)232   void UnregisterEventHandler(EventCode event_code) override {
233     ASSERT_EQ(event_code, EventCode::NUMBER_OF_COMPLETED_PACKETS) << "Only NUMBER_OF_COMPLETED_PACKETS is needed";
234     number_of_completed_packets_callback_ = {};
235   }
236 
IncomingCredit()237   void IncomingCredit() {
238     std::vector<CompletedPackets> completed_packets;
239     CompletedPackets cp;
240     cp.host_num_of_completed_packets_ = kCredits1;
241     cp.connection_handle_ = kHandle1;
242     completed_packets.push_back(cp);
243     cp.host_num_of_completed_packets_ = kCredits2;
244     cp.connection_handle_ = kHandle2;
245     completed_packets.push_back(cp);
246     auto event_builder = NumberOfCompletedPacketsBuilder::Create(completed_packets);
247     auto packet = GetPacketView(std::move(event_builder));
248     EventView event = EventView::Create(packet);
249     ASSERT_TRUE(event.IsValid());
250     number_of_completed_packets_callback_.Invoke(event);
251   }
252 
GetCommand(OpCode op_code)253   CommandView GetCommand(OpCode op_code) {
254     std::unique_lock<std::mutex> lock(mutex_);
255     std::chrono::milliseconds time = std::chrono::milliseconds(3000);
256 
257     // wait for command
258     while (command_queue_.size() == 0UL) {
259       if (not_empty_.wait_for(lock, time) == std::cv_status::timeout) {
260         break;
261       }
262     }
263     if (command_queue_.empty()) {
264       return CommandView::Create(PacketView<kLittleEndian>(std::make_shared<std::vector<uint8_t>>()));
265     }
266     CommandView command = command_queue_.front();
267     command_queue_.pop();
268     return command;
269   }
270 
ListDependencies(ModuleList * list) const271   void ListDependencies(ModuleList* list) const {}
Start()272   void Start() override {}
Stop()273   void Stop() override {}
274 
275   constexpr static uint16_t acl_data_packet_length = 1024;
276   constexpr static uint8_t synchronous_data_packet_length = 60;
277   constexpr static uint16_t total_num_acl_data_packets = 10;
278   constexpr static uint16_t total_num_synchronous_data_packets = 12;
279   uint64_t event_mask = 0;
280   uint64_t le_event_mask = 0;
281 
282  private:
283   common::ContextualCallback<void(EventView)> number_of_completed_packets_callback_;
284   std::queue<CommandView> command_queue_;
285   mutable std::mutex mutex_;
286   std::condition_variable not_empty_;
287 };
288 
289 class ControllerTest : public ::testing::Test {
290  protected:
SetUp()291   void SetUp() override {
292     feature_spec_version = feature_spec_version_;
293     bluetooth::common::InitFlags::SetAllForTesting();
294     test_hci_layer_ = new TestHciLayer;
295     fake_registry_.InjectTestModule(&HciLayer::Factory, test_hci_layer_);
296     client_handler_ = fake_registry_.GetTestModuleHandler(&HciLayer::Factory);
297     fake_registry_.Start<Controller>(&thread_);
298     controller_ = static_cast<Controller*>(fake_registry_.GetModuleUnderTest(&Controller::Factory));
299   }
300 
TearDown()301   void TearDown() override {
302     fake_registry_.StopAll();
303   }
304 
305   TestModuleRegistry fake_registry_;
306   TestHciLayer* test_hci_layer_ = nullptr;
307   os::Thread& thread_ = fake_registry_.GetTestThread();
308   Controller* controller_ = nullptr;
309   os::Handler* client_handler_ = nullptr;
310   uint16_t feature_spec_version_ = 98;
311 };
312 }  // namespace
313 
314 class Controller055Test : public ControllerTest {
315  protected:
SetUp()316   void SetUp() override {
317     feature_spec_version_ = 55;
318     ControllerTest::SetUp();
319   }
320 };
321 
322 class Controller095Test : public ControllerTest {
323  protected:
SetUp()324   void SetUp() override {
325     feature_spec_version_ = 95;
326     ControllerTest::SetUp();
327   }
328 };
329 
330 class Controller096Test : public ControllerTest {
331  protected:
SetUp()332   void SetUp() override {
333     feature_spec_version_ = 96;
334     ControllerTest::SetUp();
335   }
336 };
337 
TEST_F(ControllerTest,startup_teardown)338 TEST_F(ControllerTest, startup_teardown) {}
339 
TEST_F(ControllerTest,read_controller_info)340 TEST_F(ControllerTest, read_controller_info) {
341   ASSERT_EQ(controller_->GetAclPacketLength(), test_hci_layer_->acl_data_packet_length);
342   ASSERT_EQ(controller_->GetNumAclPacketBuffers(), test_hci_layer_->total_num_acl_data_packets);
343   ASSERT_EQ(controller_->GetScoPacketLength(), test_hci_layer_->synchronous_data_packet_length);
344   ASSERT_EQ(controller_->GetNumScoPacketBuffers(), test_hci_layer_->total_num_synchronous_data_packets);
345   ASSERT_EQ(controller_->GetMacAddress(), Address::kAny);
346   LocalVersionInformation local_version_information = controller_->GetLocalVersionInformation();
347   ASSERT_EQ(local_version_information.hci_version_, HciVersion::V_5_0);
348   ASSERT_EQ(local_version_information.hci_revision_, 0x1234);
349   ASSERT_EQ(local_version_information.lmp_version_, LmpVersion::V_4_2);
350   ASSERT_EQ(local_version_information.manufacturer_name_, 0xBAD);
351   ASSERT_EQ(local_version_information.lmp_subversion_, 0x5678);
352   ASSERT_EQ(controller_->GetLeBufferSize().le_data_packet_length_, 0x16);
353   ASSERT_EQ(controller_->GetLeBufferSize().total_num_le_packets_, 0x08);
354   ASSERT_EQ(controller_->GetLeSupportedStates(), 0x001f123456789abeUL);
355   ASSERT_EQ(controller_->GetLeMaximumDataLength().supported_max_tx_octets_, 0x12);
356   ASSERT_EQ(controller_->GetLeMaximumDataLength().supported_max_tx_time_, 0x34);
357   ASSERT_EQ(controller_->GetLeMaximumDataLength().supported_max_rx_octets_, 0x56);
358   ASSERT_EQ(controller_->GetLeMaximumDataLength().supported_max_rx_time_, 0x78);
359   ASSERT_EQ(controller_->GetLeMaximumAdvertisingDataLength(), 0x0672);
360   ASSERT_EQ(controller_->GetLeNumberOfSupportedAdverisingSets(), 0xF0);
361 }
362 
TEST_F(ControllerTest,read_write_local_name)363 TEST_F(ControllerTest, read_write_local_name) {
364   ASSERT_EQ(controller_->GetLocalName(), "DUT");
365   controller_->WriteLocalName("New name");
366   ASSERT_EQ(controller_->GetLocalName(), "New name");
367 }
368 
TEST_F(ControllerTest,send_set_event_mask_command)369 TEST_F(ControllerTest, send_set_event_mask_command) {
370   uint64_t new_event_mask = test_hci_layer_->event_mask - 1;
371   controller_->SetEventMask(new_event_mask);
372   // Send another command to make sure it was applied
373   controller_->Reset();
374   auto packet = test_hci_layer_->GetCommand(OpCode::RESET);
375   ASSERT_EQ(new_event_mask, test_hci_layer_->event_mask);
376 }
377 
TEST_F(ControllerTest,send_reset_command)378 TEST_F(ControllerTest, send_reset_command) {
379   controller_->Reset();
380   auto packet = test_hci_layer_->GetCommand(OpCode::RESET);
381   auto command = ResetView::Create(packet);
382   ASSERT_TRUE(command.IsValid());
383 }
384 
TEST_F(ControllerTest,send_set_event_filter_command)385 TEST_F(ControllerTest, send_set_event_filter_command) {
386   controller_->SetEventFilterInquiryResultAllDevices();
387   auto packet = test_hci_layer_->GetCommand(OpCode::SET_EVENT_FILTER);
388   auto set_event_filter_view1 = SetEventFilterView::Create(packet);
389   auto set_event_filter_inquiry_result_view1 = SetEventFilterInquiryResultView::Create(set_event_filter_view1);
390   auto command1 = SetEventFilterInquiryResultAllDevicesView::Create(set_event_filter_inquiry_result_view1);
391   ASSERT_TRUE(command1.IsValid());
392 
393   ClassOfDevice class_of_device({0xab, 0xcd, 0xef});
394   ClassOfDevice class_of_device_mask({0x12, 0x34, 0x56});
395   controller_->SetEventFilterInquiryResultClassOfDevice(class_of_device, class_of_device_mask);
396   packet = test_hci_layer_->GetCommand(OpCode::SET_EVENT_FILTER);
397   auto set_event_filter_view2 = SetEventFilterView::Create(packet);
398   auto set_event_filter_inquiry_result_view2 = SetEventFilterInquiryResultView::Create(set_event_filter_view2);
399   auto command2 = SetEventFilterInquiryResultClassOfDeviceView::Create(set_event_filter_inquiry_result_view2);
400   ASSERT_TRUE(command2.IsValid());
401   ASSERT_EQ(command2.GetClassOfDevice(), class_of_device);
402 
403   Address bdaddr({0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc});
404   controller_->SetEventFilterConnectionSetupAddress(bdaddr, AutoAcceptFlag::AUTO_ACCEPT_ON_ROLE_SWITCH_ENABLED);
405   packet = test_hci_layer_->GetCommand(OpCode::SET_EVENT_FILTER);
406   auto set_event_filter_view3 = SetEventFilterView::Create(packet);
407   auto set_event_filter_connection_setup_view = SetEventFilterConnectionSetupView::Create(set_event_filter_view3);
408   auto command3 = SetEventFilterConnectionSetupAddressView::Create(set_event_filter_connection_setup_view);
409   ASSERT_TRUE(command3.IsValid());
410   ASSERT_EQ(command3.GetAddress(), bdaddr);
411 }
412 
TEST_F(ControllerTest,send_host_buffer_size_command)413 TEST_F(ControllerTest, send_host_buffer_size_command) {
414   controller_->HostBufferSize(0xFF00, 0xF1, 0xFF02, 0xFF03);
415   auto packet = test_hci_layer_->GetCommand(OpCode::HOST_BUFFER_SIZE);
416   auto command = HostBufferSizeView::Create(packet);
417   ASSERT_TRUE(command.IsValid());
418   ASSERT_EQ(command.GetHostAclDataPacketLength(), 0xFF00);
419   ASSERT_EQ(command.GetHostSynchronousDataPacketLength(), 0xF1);
420   ASSERT_EQ(command.GetHostTotalNumAclDataPackets(), 0xFF02);
421   ASSERT_EQ(command.GetHostTotalNumSynchronousDataPackets(), 0xFF03);
422 }
423 
TEST_F(ControllerTest,send_le_set_event_mask_command)424 TEST_F(ControllerTest, send_le_set_event_mask_command) {
425   uint64_t new_le_event_mask = test_hci_layer_->event_mask - 1;
426   controller_->LeSetEventMask(new_le_event_mask);
427   // Send another command to make sure it was applied
428   controller_->Reset();
429   auto packet = test_hci_layer_->GetCommand(OpCode::RESET);
430   ASSERT_EQ(new_le_event_mask, test_hci_layer_->le_event_mask);
431 }
432 
TEST_F(ControllerTest,is_supported_test)433 TEST_F(ControllerTest, is_supported_test) {
434   ASSERT_TRUE(controller_->IsSupported(OpCode::INQUIRY));
435   ASSERT_TRUE(controller_->IsSupported(OpCode::REJECT_CONNECTION_REQUEST));
436   ASSERT_TRUE(controller_->IsSupported(OpCode::ACCEPT_CONNECTION_REQUEST));
437   ASSERT_FALSE(controller_->IsSupported(OpCode::LE_REMOVE_ADVERTISING_SET));
438   ASSERT_FALSE(controller_->IsSupported(OpCode::LE_CLEAR_ADVERTISING_SETS));
439   ASSERT_FALSE(controller_->IsSupported(OpCode::LE_SET_PERIODIC_ADVERTISING_PARAMETERS));
440 }
441 
TEST_F(Controller055Test,feature_spec_version_055_test)442 TEST_F(Controller055Test, feature_spec_version_055_test) {
443   ASSERT_EQ(controller_->GetVendorCapabilities().version_supported_, 55);
444   ASSERT_TRUE(controller_->IsSupported(OpCode::LE_MULTI_ADVT));
445   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_DEBUG_INFO));
446   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_A2DP_OPCODE));
447 }
448 
TEST_F(Controller095Test,feature_spec_version_095_test)449 TEST_F(Controller095Test, feature_spec_version_095_test) {
450   ASSERT_EQ(controller_->GetVendorCapabilities().version_supported_, 95);
451   ASSERT_TRUE(controller_->IsSupported(OpCode::LE_MULTI_ADVT));
452   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_DEBUG_INFO));
453   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_A2DP_OPCODE));
454 }
455 
TEST_F(Controller096Test,feature_spec_version_096_test)456 TEST_F(Controller096Test, feature_spec_version_096_test) {
457   ASSERT_EQ(controller_->GetVendorCapabilities().version_supported_, 96);
458   ASSERT_TRUE(controller_->IsSupported(OpCode::LE_MULTI_ADVT));
459   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_DEBUG_INFO));
460   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_A2DP_OPCODE));
461 }
462 
TEST_F(ControllerTest,feature_spec_version_098_test)463 TEST_F(ControllerTest, feature_spec_version_098_test) {
464   ASSERT_EQ(controller_->GetVendorCapabilities().version_supported_, 98);
465   ASSERT_TRUE(controller_->IsSupported(OpCode::LE_MULTI_ADVT));
466   ASSERT_FALSE(controller_->IsSupported(OpCode::CONTROLLER_DEBUG_INFO));
467   ASSERT_TRUE(controller_->IsSupported(OpCode::CONTROLLER_A2DP_OPCODE));
468 }
469 
470 std::promise<void> credits1_set;
471 std::promise<void> credits2_set;
472 
CheckReceivedCredits(uint16_t handle,uint16_t credits)473 void CheckReceivedCredits(uint16_t handle, uint16_t credits) {
474   switch (handle) {
475     case (kHandle1):
476       ASSERT_EQ(kCredits1, credits);
477       credits1_set.set_value();
478       break;
479     case (kHandle2):
480       ASSERT_EQ(kCredits2, credits);
481       credits2_set.set_value();
482       break;
483     default:
484       ASSERT_LOG(false, "Unknown handle 0x%0hx with 0x%0hx credits", handle, credits);
485   }
486 }
487 
TEST_F(ControllerTest,aclCreditCallbacksTest)488 TEST_F(ControllerTest, aclCreditCallbacksTest) {
489   credits1_set = std::promise<void>();
490   credits2_set = std::promise<void>();
491 
492   auto credits1_set_future = credits1_set.get_future();
493   auto credits2_set_future = credits2_set.get_future();
494 
495   controller_->RegisterCompletedAclPacketsCallback(client_handler_->Bind(&CheckReceivedCredits));
496 
497   test_hci_layer_->IncomingCredit();
498 
499   ASSERT_EQ(std::future_status::ready, credits1_set_future.wait_for(2s));
500   ASSERT_EQ(std::future_status::ready, credits2_set_future.wait_for(2s));
501 }
502 
TEST_F(ControllerTest,aclCreditCallbackListenerUnregistered)503 TEST_F(ControllerTest, aclCreditCallbackListenerUnregistered) {
504   os::Thread thread("test_thread", os::Thread::Priority::NORMAL);
505   os::Handler handler(&thread);
506   controller_->RegisterCompletedAclPacketsCallback(handler.Bind(&CheckReceivedCredits));
507 
508   handler.Clear();
509   handler.WaitUntilStopped(std::chrono::milliseconds(100));
510   controller_->UnregisterCompletedAclPacketsCallback();
511 
512   test_hci_layer_->IncomingCredit();
513 }
514 
515 std::promise<uint64_t> le_rand_set;
516 
le_rand_callback(uint64_t random)517 void le_rand_callback(uint64_t random) {
518   le_rand_set.set_value(random);
519 }
520 
TEST_F(ControllerTest,leRandTest)521 TEST_F(ControllerTest, leRandTest) {
522   le_rand_set = std::promise<uint64_t>();
523   auto le_rand_set_future = le_rand_set.get_future();
524 
525   controller_->LeRand(common::Bind(le_rand_callback));
526 
527   ASSERT_EQ(std::future_status::ready, le_rand_set_future.wait_for(2s));
528   ASSERT_EQ(kRandomNumber, le_rand_set_future.get());
529 }
530 
TEST_F(ControllerTest,Dumpsys)531 TEST_F(ControllerTest, Dumpsys) {
532   ModuleDumper dumper(fake_registry_, title);
533 
534   std::string output;
535   dumper.DumpState(&output);
536 
537   ASSERT_TRUE(output.find("Hci Controller Dumpsys") != std::string::npos);
538 }
539 
540 }  // namespace hci
541 }  // namespace bluetooth
542