1 /*
2  * Copyright 2020 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/le_address_manager.h"
18 
19 #include <gtest/gtest.h>
20 
21 #include "common/init_flags.h"
22 #include "os/log.h"
23 #include "packet/raw_builder.h"
24 
25 using ::bluetooth::crypto_toolbox::Octet16;
26 using ::bluetooth::os::Handler;
27 using ::bluetooth::os::Thread;
28 
29 namespace bluetooth {
30 namespace hci {
31 
32 using packet::kLittleEndian;
33 using packet::PacketView;
34 using packet::RawBuilder;
35 
GetPacketView(std::unique_ptr<packet::BasePacketBuilder> packet)36 PacketView<kLittleEndian> GetPacketView(std::unique_ptr<packet::BasePacketBuilder> packet) {
37   auto bytes = std::make_shared<std::vector<uint8_t>>();
38   BitInserter i(*bytes);
39   bytes->reserve(packet->size());
40   packet->Serialize(i);
41   return packet::PacketView<packet::kLittleEndian>(bytes);
42 }
43 
44 class TestHciLayer : public HciLayer {
45  public:
EnqueueCommand(std::unique_ptr<CommandBuilder> command,common::ContextualOnceCallback<void (CommandCompleteView)> on_complete)46   void EnqueueCommand(
47       std::unique_ptr<CommandBuilder> command,
48       common::ContextualOnceCallback<void(CommandCompleteView)> on_complete) override {
49     std::lock_guard<std::mutex> lock(mutex_);
50     command_queue_.push(std::move(command));
51     command_complete_callbacks.push_back(std::move(on_complete));
52     if (command_promise_ != nullptr) {
53       command_promise_->set_value();
54       command_promise_.reset();
55     }
56   }
57 
SetCommandFuture()58   void SetCommandFuture() {
59     ASSERT_LOG(command_promise_ == nullptr, "Promises, Promises, ... Only one at a time.");
60     command_promise_ = std::make_unique<std::promise<void>>();
61     command_future_ = std::make_unique<std::future<void>>(command_promise_->get_future());
62   }
63 
GetLastCommand()64   CommandView GetLastCommand() {
65     if (command_queue_.size() == 0) {
66       return CommandView::Create(PacketView<kLittleEndian>(std::make_shared<std::vector<uint8_t>>()));
67     }
68     auto last = std::move(command_queue_.front());
69     command_queue_.pop();
70     return CommandView::Create(GetPacketView(std::move(last)));
71   }
72 
GetCommand(OpCode op_code)73   CommandView GetCommand(OpCode op_code) {
74     if (!command_queue_.empty()) {
75       std::lock_guard<std::mutex> lock(mutex_);
76       if (command_future_ != nullptr) {
77         command_future_.reset();
78         command_promise_.reset();
79       }
80     } else if (command_future_ != nullptr) {
81       auto result = command_future_->wait_for(std::chrono::milliseconds(1000));
82       EXPECT_NE(std::future_status::timeout, result);
83     }
84     std::lock_guard<std::mutex> lock(mutex_);
85     ASSERT_LOG(
86         !command_queue_.empty(), "Expecting command %s but command queue was empty", OpCodeText(op_code).c_str());
87     CommandView command_packet_view = GetLastCommand();
88     EXPECT_TRUE(command_packet_view.IsValid());
89     EXPECT_EQ(command_packet_view.GetOpCode(), op_code);
90     return command_packet_view;
91   }
92 
IncomingEvent(std::unique_ptr<EventBuilder> event_builder)93   void IncomingEvent(std::unique_ptr<EventBuilder> event_builder) {
94     auto packet = GetPacketView(std::move(event_builder));
95     EventView event = EventView::Create(packet);
96     ASSERT_TRUE(event.IsValid());
97     CommandCompleteCallback(event);
98   }
99 
CommandCompleteCallback(EventView event)100   void CommandCompleteCallback(EventView event) {
101     CommandCompleteView complete_view = CommandCompleteView::Create(event);
102     ASSERT_TRUE(complete_view.IsValid());
103     std::move(command_complete_callbacks.front()).Invoke(complete_view);
104     command_complete_callbacks.pop_front();
105   }
106 
ListDependencies(ModuleList * list)107   void ListDependencies(ModuleList* list) override {}
Start()108   void Start() override {}
Stop()109   void Stop() override {}
110 
111  private:
112   std::list<common::ContextualOnceCallback<void(CommandCompleteView)>> command_complete_callbacks;
113   std::queue<std::unique_ptr<CommandBuilder>> command_queue_;
114   std::unique_ptr<std::promise<void>> command_promise_;
115   std::unique_ptr<std::future<void>> command_future_;
116   mutable std::mutex mutex_;
117 };
118 
119 class RotatorClient : public LeAddressManagerCallback {
120  public:
RotatorClient(LeAddressManager * le_address_manager,size_t id)121   RotatorClient(LeAddressManager* le_address_manager, size_t id) : le_address_manager_(le_address_manager), id_(id){};
122 
OnPause()123   void OnPause() {
124     paused = true;
125     le_address_manager_->AckPause(this);
126   }
127 
OnResume()128   void OnResume() {
129     paused = false;
130     le_address_manager_->AckResume(this);
131     if (resume_promise_ != nullptr) {
132       resume_promise_->set_value();
133       resume_promise_.reset();
134     }
135   }
136 
WaitForResume()137   void WaitForResume() {
138     if (paused) {
139       resume_promise_ = std::make_unique<std::promise<void>>();
140       auto resume_future = resume_promise_->get_future();
141       auto result = resume_future.wait_for(std::chrono::milliseconds(1000));
142       EXPECT_NE(std::future_status::timeout, result);
143     }
144   }
145 
146   bool paused{false};
147   LeAddressManager* le_address_manager_;
148   size_t id_;
149   std::unique_ptr<std::promise<void>> resume_promise_;
150 };
151 
152 class LeAddressManagerTest : public ::testing::Test {
153  public:
SetUp()154   void SetUp() override {
155     thread_ = new Thread("thread", Thread::Priority::NORMAL);
156     handler_ = new Handler(thread_);
157     test_hci_layer_ = new TestHciLayer;
158     Address address({0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
159     le_address_manager_ = new LeAddressManager(
160         common::Bind(&LeAddressManagerTest::enqueue_command, common::Unretained(this)), handler_, address, 0x3F, 0x3F);
161     AllocateClients(1);
162   }
163 
sync_handler(os::Handler * handler)164   void sync_handler(os::Handler* handler) {
165     std::promise<void> promise;
166     auto future = promise.get_future();
167     handler_->Post(common::BindOnce(&std::promise<void>::set_value, common::Unretained(&promise)));
168     auto future_status = future.wait_for(std::chrono::seconds(1));
169     EXPECT_EQ(future_status, std::future_status::ready);
170   }
171 
TearDown()172   void TearDown() override {
173     sync_handler(handler_);
174     delete le_address_manager_;
175     delete test_hci_layer_;
176     handler_->Clear();
177     delete handler_;
178     delete thread_;
179   }
180 
AllocateClients(size_t num_clients)181   void AllocateClients(size_t num_clients) {
182     size_t first_id = clients.size();
183     for (size_t i = 0; i < num_clients; i++) {
184       clients.emplace_back(std::make_unique<RotatorClient>(le_address_manager_, first_id + i));
185     }
186   }
187 
enqueue_command(std::unique_ptr<CommandBuilder> command_packet)188   void enqueue_command(std::unique_ptr<CommandBuilder> command_packet) {
189     test_hci_layer_->EnqueueCommand(
190         std::move(command_packet),
191         handler_->BindOnce(&LeAddressManager::OnCommandComplete, common::Unretained(le_address_manager_)));
192   }
193 
194   Thread* thread_;
195   Handler* handler_;
196   TestHciLayer* test_hci_layer_ = nullptr;
197   LeAddressManager* le_address_manager_;
198   std::vector<std::unique_ptr<RotatorClient>> clients;
199 };
200 
TEST_F(LeAddressManagerTest,startup_teardown)201 TEST_F(LeAddressManagerTest, startup_teardown) {}
202 
TEST_F(LeAddressManagerTest,register_unregister_callback)203 TEST_F(LeAddressManagerTest, register_unregister_callback) {
204   le_address_manager_->Register(clients[0].get());
205   sync_handler(handler_);
206   le_address_manager_->Unregister(clients[0].get());
207   sync_handler(handler_);
208 }
209 
TEST_F(LeAddressManagerTest,rotator_address_for_single_client)210 TEST_F(LeAddressManagerTest, rotator_address_for_single_client) {
211   Octet16 irk = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05, 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
212   auto minimum_rotation_time = std::chrono::milliseconds(1000);
213   auto maximum_rotation_time = std::chrono::milliseconds(3000);
214   AddressWithType remote_address(Address::kEmpty, AddressType::RANDOM_DEVICE_ADDRESS);
215   le_address_manager_->SetPrivacyPolicyForInitiatorAddress(
216       LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS,
217       remote_address,
218       irk,
219       minimum_rotation_time,
220       maximum_rotation_time);
221 
222   test_hci_layer_->SetCommandFuture();
223   le_address_manager_->Register(clients[0].get());
224   sync_handler(handler_);
225   test_hci_layer_->GetCommand(OpCode::LE_SET_RANDOM_ADDRESS);
226   test_hci_layer_->IncomingEvent(LeSetRandomAddressCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
227   clients[0].get()->WaitForResume();
228   le_address_manager_->Unregister(clients[0].get());
229   sync_handler(handler_);
230 }
231 
TEST_F(LeAddressManagerTest,rotator_non_resolvable_address_for_single_client)232 TEST_F(LeAddressManagerTest, rotator_non_resolvable_address_for_single_client) {
233   Octet16 irk = {};
234   auto minimum_rotation_time = std::chrono::milliseconds(1000);
235   auto maximum_rotation_time = std::chrono::milliseconds(3000);
236   AddressWithType remote_address(Address::kEmpty, AddressType::RANDOM_DEVICE_ADDRESS);
237   le_address_manager_->SetPrivacyPolicyForInitiatorAddress(
238       LeAddressManager::AddressPolicy::USE_NON_RESOLVABLE_ADDRESS,
239       remote_address,
240       irk,
241       minimum_rotation_time,
242       maximum_rotation_time);
243 
244   test_hci_layer_->SetCommandFuture();
245   le_address_manager_->Register(clients[0].get());
246   sync_handler(handler_);
247   test_hci_layer_->GetCommand(OpCode::LE_SET_RANDOM_ADDRESS);
248   test_hci_layer_->IncomingEvent(LeSetRandomAddressCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
249   clients[0].get()->WaitForResume();
250   le_address_manager_->Unregister(clients[0].get());
251   sync_handler(handler_);
252 }
253 
254 // TODO handle the case "register during rotate_random_address" and enable this
TEST_F(LeAddressManagerTest,DISABLED_rotator_address_for_multiple_clients)255 TEST_F(LeAddressManagerTest, DISABLED_rotator_address_for_multiple_clients) {
256   AllocateClients(2);
257   Octet16 irk = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05, 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
258   auto minimum_rotation_time = std::chrono::milliseconds(1000);
259   auto maximum_rotation_time = std::chrono::milliseconds(3000);
260   AddressWithType remote_address(Address::kEmpty, AddressType::RANDOM_DEVICE_ADDRESS);
261   le_address_manager_->SetPrivacyPolicyForInitiatorAddress(
262       LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS,
263       remote_address,
264       irk,
265       minimum_rotation_time,
266       maximum_rotation_time);
267   le_address_manager_->Register(clients[0].get());
268   le_address_manager_->Register(clients[1].get());
269   le_address_manager_->Register(clients[2].get());
270   sync_handler(handler_);
271 
272   le_address_manager_->Unregister(clients[0].get());
273   le_address_manager_->Unregister(clients[1].get());
274   le_address_manager_->Unregister(clients[2].get());
275   sync_handler(handler_);
276 }
277 
278 class LeAddressManagerWithSingleClientTest : public LeAddressManagerTest {
279  public:
SetUp()280   void SetUp() override {
281     bluetooth::common::InitFlags::SetAllForTesting();
282     thread_ = new Thread("thread", Thread::Priority::NORMAL);
283     handler_ = new Handler(thread_);
284     test_hci_layer_ = new TestHciLayer;
285     Address address({0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
286     le_address_manager_ = new LeAddressManager(
287         common::Bind(&LeAddressManagerWithSingleClientTest::enqueue_command, common::Unretained(this)),
288         handler_,
289         address,
290         0x3F,
291         0x3F);
292     AllocateClients(1);
293 
294     Octet16 irk = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05, 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
295     auto minimum_rotation_time = std::chrono::milliseconds(1000);
296     auto maximum_rotation_time = std::chrono::milliseconds(3000);
297     AddressWithType remote_address(Address::kEmpty, AddressType::RANDOM_DEVICE_ADDRESS);
298     le_address_manager_->SetPrivacyPolicyForInitiatorAddress(
299         LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS,
300         remote_address,
301         irk,
302         minimum_rotation_time,
303         maximum_rotation_time);
304 
305     test_hci_layer_->SetCommandFuture();
306     le_address_manager_->Register(clients[0].get());
307     sync_handler(handler_);
308     test_hci_layer_->GetCommand(OpCode::LE_SET_RANDOM_ADDRESS);
309     test_hci_layer_->IncomingEvent(LeSetRandomAddressCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
310   }
311 
enqueue_command(std::unique_ptr<CommandBuilder> command_packet)312   void enqueue_command(std::unique_ptr<CommandBuilder> command_packet) {
313     test_hci_layer_->EnqueueCommand(
314         std::move(command_packet),
315         handler_->BindOnce(&LeAddressManager::OnCommandComplete, common::Unretained(le_address_manager_)));
316   }
317 
TearDown()318   void TearDown() override {
319     le_address_manager_->Unregister(clients[0].get());
320     sync_handler(handler_);
321     delete le_address_manager_;
322     delete test_hci_layer_;
323     handler_->Clear();
324     delete handler_;
325     delete thread_;
326   }
327 };
328 
TEST_F(LeAddressManagerWithSingleClientTest,add_device_to_connect_list)329 TEST_F(LeAddressManagerWithSingleClientTest, add_device_to_connect_list) {
330   Address address;
331   Address::FromString("01:02:03:04:05:06", address);
332   test_hci_layer_->SetCommandFuture();
333   le_address_manager_->AddDeviceToConnectList(ConnectListAddressType::RANDOM, address);
334   auto packet = test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_CONNECT_LIST);
335   auto packet_view =
336       LeAddDeviceToConnectListView::Create(LeConnectionManagementCommandView::Create(AclCommandView::Create(packet)));
337   ASSERT_TRUE(packet_view.IsValid());
338   ASSERT_EQ(ConnectListAddressType::RANDOM, packet_view.GetAddressType());
339   ASSERT_EQ(address, packet_view.GetAddress());
340 
341   test_hci_layer_->IncomingEvent(LeAddDeviceToConnectListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
342   clients[0].get()->WaitForResume();
343 }
344 
TEST_F(LeAddressManagerWithSingleClientTest,remove_device_from_connect_list)345 TEST_F(LeAddressManagerWithSingleClientTest, remove_device_from_connect_list) {
346   Address address;
347   Address::FromString("01:02:03:04:05:06", address);
348   test_hci_layer_->SetCommandFuture();
349   le_address_manager_->AddDeviceToConnectList(ConnectListAddressType::RANDOM, address);
350   test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_CONNECT_LIST);
351   test_hci_layer_->IncomingEvent(LeAddDeviceToConnectListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
352 
353   test_hci_layer_->SetCommandFuture();
354   le_address_manager_->RemoveDeviceFromConnectList(ConnectListAddressType::RANDOM, address);
355   auto packet = test_hci_layer_->GetCommand(OpCode::LE_REMOVE_DEVICE_FROM_CONNECT_LIST);
356   auto packet_view = LeRemoveDeviceFromConnectListView::Create(
357       LeConnectionManagementCommandView::Create(AclCommandView::Create(packet)));
358   ASSERT_TRUE(packet_view.IsValid());
359   ASSERT_EQ(ConnectListAddressType::RANDOM, packet_view.GetAddressType());
360   ASSERT_EQ(address, packet_view.GetAddress());
361   test_hci_layer_->IncomingEvent(LeRemoveDeviceFromConnectListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
362   clients[0].get()->WaitForResume();
363 }
364 
TEST_F(LeAddressManagerWithSingleClientTest,clear_connect_list)365 TEST_F(LeAddressManagerWithSingleClientTest, clear_connect_list) {
366   Address address;
367   Address::FromString("01:02:03:04:05:06", address);
368   test_hci_layer_->SetCommandFuture();
369   le_address_manager_->AddDeviceToConnectList(ConnectListAddressType::RANDOM, address);
370   test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_CONNECT_LIST);
371   test_hci_layer_->IncomingEvent(LeAddDeviceToConnectListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
372 
373   test_hci_layer_->SetCommandFuture();
374   le_address_manager_->ClearConnectList();
375   test_hci_layer_->GetCommand(OpCode::LE_CLEAR_CONNECT_LIST);
376   test_hci_layer_->IncomingEvent(LeClearConnectListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
377   clients[0].get()->WaitForResume();
378 }
379 
TEST_F(LeAddressManagerWithSingleClientTest,add_device_to_resolving_list)380 TEST_F(LeAddressManagerWithSingleClientTest, add_device_to_resolving_list) {
381   Address address;
382   Address::FromString("01:02:03:04:05:06", address);
383   Octet16 peer_irk = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05, 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
384   Octet16 local_irk = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};
385   test_hci_layer_->SetCommandFuture();
386   le_address_manager_->AddDeviceToResolvingList(
387       PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS, address, peer_irk, local_irk);
388   auto packet = test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_RESOLVING_LIST);
389   auto packet_view = LeAddDeviceToResolvingListView::Create(LeSecurityCommandView::Create(packet));
390   ASSERT_TRUE(packet_view.IsValid());
391   ASSERT_EQ(PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS, packet_view.GetPeerIdentityAddressType());
392   ASSERT_EQ(address, packet_view.GetPeerIdentityAddress());
393   ASSERT_EQ(peer_irk, packet_view.GetPeerIrk());
394   ASSERT_EQ(local_irk, packet_view.GetLocalIrk());
395 
396   test_hci_layer_->IncomingEvent(LeAddDeviceToResolvingListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
397   clients[0].get()->WaitForResume();
398 }
399 
TEST_F(LeAddressManagerWithSingleClientTest,remove_device_from_resolving_list)400 TEST_F(LeAddressManagerWithSingleClientTest, remove_device_from_resolving_list) {
401   Address address;
402   Address::FromString("01:02:03:04:05:06", address);
403   Octet16 peer_irk = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05, 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
404   Octet16 local_irk = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};
405   test_hci_layer_->SetCommandFuture();
406   le_address_manager_->AddDeviceToResolvingList(
407       PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS, address, peer_irk, local_irk);
408   test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_RESOLVING_LIST);
409   test_hci_layer_->IncomingEvent(LeAddDeviceToResolvingListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
410 
411   test_hci_layer_->SetCommandFuture();
412   le_address_manager_->RemoveDeviceFromResolvingList(PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS, address);
413   auto packet = test_hci_layer_->GetCommand(OpCode::LE_REMOVE_DEVICE_FROM_RESOLVING_LIST);
414   auto packet_view = LeRemoveDeviceFromResolvingListView::Create(LeSecurityCommandView::Create(packet));
415   ASSERT_TRUE(packet_view.IsValid());
416   ASSERT_EQ(PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS, packet_view.GetPeerIdentityAddressType());
417   ASSERT_EQ(address, packet_view.GetPeerIdentityAddress());
418   test_hci_layer_->IncomingEvent(LeRemoveDeviceFromResolvingListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
419   clients[0].get()->WaitForResume();
420 }
421 
TEST_F(LeAddressManagerWithSingleClientTest,clear_resolving_list)422 TEST_F(LeAddressManagerWithSingleClientTest, clear_resolving_list) {
423   Address address;
424   Address::FromString("01:02:03:04:05:06", address);
425   Octet16 peer_irk = {0xec, 0x02, 0x34, 0xa3, 0x57, 0xc8, 0xad, 0x05, 0x34, 0x10, 0x10, 0xa6, 0x0a, 0x39, 0x7d, 0x9b};
426   Octet16 local_irk = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};
427   test_hci_layer_->SetCommandFuture();
428   le_address_manager_->AddDeviceToResolvingList(
429       PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS, address, peer_irk, local_irk);
430   test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_RESOLVING_LIST);
431   test_hci_layer_->IncomingEvent(LeAddDeviceToResolvingListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
432 
433   test_hci_layer_->SetCommandFuture();
434   le_address_manager_->ClearResolvingList();
435   auto packet = test_hci_layer_->GetCommand(OpCode::LE_CLEAR_RESOLVING_LIST);
436   auto packet_view = LeClearResolvingListView::Create(LeSecurityCommandView::Create(packet));
437   ASSERT_TRUE(packet_view.IsValid());
438   test_hci_layer_->IncomingEvent(LeClearResolvingListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
439   clients[0].get()->WaitForResume();
440 }
441 
TEST_F(LeAddressManagerWithSingleClientTest,register_during_command_complete)442 TEST_F(LeAddressManagerWithSingleClientTest, register_during_command_complete) {
443   Address address;
444   Address::FromString("01:02:03:04:05:06", address);
445   test_hci_layer_->SetCommandFuture();
446   le_address_manager_->AddDeviceToConnectList(ConnectListAddressType::RANDOM, address);
447   auto packet = test_hci_layer_->GetCommand(OpCode::LE_ADD_DEVICE_TO_CONNECT_LIST);
448   auto packet_view =
449       LeAddDeviceToConnectListView::Create(LeConnectionManagementCommandView::Create(AclCommandView::Create(packet)));
450   ASSERT_TRUE(packet_view.IsValid());
451   ASSERT_EQ(ConnectListAddressType::RANDOM, packet_view.GetAddressType());
452   ASSERT_EQ(address, packet_view.GetAddress());
453   test_hci_layer_->IncomingEvent(LeAddDeviceToConnectListCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
454 
455   AllocateClients(1);
456   test_hci_layer_->SetCommandFuture();
457   le_address_manager_->Register(clients[1].get());
458   clients[0].get()->WaitForResume();
459   clients[1].get()->WaitForResume();
460 }
461 
462 }  // namespace hci
463 }  // namespace bluetooth
464