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