| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromeos/components/tether/fake_ble_connection_manager.h" |
| |
| #include "chromeos/components/tether/timer_factory.h" |
| #include "device/bluetooth/bluetooth_adapter.h" |
| |
| namespace chromeos { |
| |
| namespace tether { |
| |
| FakeBleConnectionManager::StatusAndRegisteredConnectionRequestIds:: |
| StatusAndRegisteredConnectionRequestIds() |
| : status(secure_channel::SecureChannel::Status::DISCONNECTED) {} |
| |
| FakeBleConnectionManager::StatusAndRegisteredConnectionRequestIds:: |
| StatusAndRegisteredConnectionRequestIds( |
| const StatusAndRegisteredConnectionRequestIds& other) = default; |
| |
| FakeBleConnectionManager::StatusAndRegisteredConnectionRequestIds:: |
| ~StatusAndRegisteredConnectionRequestIds() = default; |
| |
| FakeBleConnectionManager::FakeBleConnectionManager() |
| : BleConnectionManager(nullptr, |
| nullptr, |
| nullptr, |
| nullptr) {} |
| |
| FakeBleConnectionManager::~FakeBleConnectionManager() = default; |
| |
| void FakeBleConnectionManager::SetDeviceStatus( |
| const std::string& device_id, |
| const secure_channel::SecureChannel::Status& status, |
| BleConnectionManager::StateChangeDetail state_change_detail) { |
| const auto iter = device_id_map_.find(device_id); |
| DCHECK(iter != device_id_map_.end()); |
| |
| secure_channel::SecureChannel::Status old_status = iter->second.status; |
| if (old_status == status) { |
| // If the status has not changed, do not do anything. |
| return; |
| } |
| |
| iter->second.status = status; |
| NotifySecureChannelStatusChanged(device_id, old_status, status, |
| state_change_detail); |
| } |
| |
| void FakeBleConnectionManager::ReceiveMessage(const std::string& device_id, |
| const std::string& payload) { |
| DCHECK(device_id_map_.find(device_id) != device_id_map_.end()); |
| NotifyMessageReceived(device_id, payload); |
| } |
| |
| void FakeBleConnectionManager::SetMessageSent(int sequence_number) { |
| DCHECK(sequence_number < next_sequence_number_); |
| NotifyMessageSent(sequence_number); |
| } |
| |
| void FakeBleConnectionManager::SimulateUnansweredConnectionAttempts( |
| const std::string& device_id, |
| size_t num_attempts) { |
| for (size_t i = 0; i < num_attempts; ++i) { |
| SetDeviceStatus(device_id, |
| secure_channel::SecureChannel::Status::CONNECTING, |
| StateChangeDetail::STATE_CHANGE_DETAIL_NONE); |
| SetDeviceStatus( |
| device_id, secure_channel::SecureChannel::Status::DISCONNECTED, |
| StateChangeDetail::STATE_CHANGE_DETAIL_COULD_NOT_ATTEMPT_CONNECTION); |
| } |
| } |
| |
| void FakeBleConnectionManager::SimulateGattErrorConnectionAttempts( |
| const std::string& device_id, |
| size_t num_attempts) { |
| for (size_t i = 0; i < num_attempts; ++i) { |
| SetDeviceStatus(device_id, |
| secure_channel::SecureChannel::Status::CONNECTING, |
| StateChangeDetail::STATE_CHANGE_DETAIL_NONE); |
| SetDeviceStatus(device_id, secure_channel::SecureChannel::Status::CONNECTED, |
| StateChangeDetail::STATE_CHANGE_DETAIL_NONE); |
| SetDeviceStatus(device_id, |
| secure_channel::SecureChannel::Status::AUTHENTICATING, |
| StateChangeDetail::STATE_CHANGE_DETAIL_NONE); |
| SetDeviceStatus( |
| device_id, secure_channel::SecureChannel::Status::DISCONNECTED, |
| StateChangeDetail::STATE_CHANGE_DETAIL_GATT_CONNECTION_WAS_ATTEMPTED); |
| } |
| } |
| |
| bool FakeBleConnectionManager::IsRegistered(const std::string& device_id) { |
| return base::ContainsKey(device_id_map_, device_id); |
| } |
| |
| void FakeBleConnectionManager::RegisterRemoteDevice( |
| const std::string& device_id, |
| const base::UnguessableToken& request_id, |
| secure_channel::ConnectionPriority connection_priority) { |
| StatusAndRegisteredConnectionRequestIds& value = device_id_map_[device_id]; |
| value.registered_request_ids.insert(request_id); |
| } |
| |
| void FakeBleConnectionManager::UnregisterRemoteDevice( |
| const std::string& device_id, |
| const base::UnguessableToken& request_id) { |
| StatusAndRegisteredConnectionRequestIds& value = device_id_map_[device_id]; |
| value.registered_request_ids.erase(request_id); |
| if (value.registered_request_ids.empty()) |
| device_id_map_.erase(device_id); |
| } |
| |
| int FakeBleConnectionManager::SendMessage(const std::string& device_id, |
| const std::string& message) { |
| sent_messages_.push_back({device_id, message}); |
| return next_sequence_number_++; |
| } |
| |
| bool FakeBleConnectionManager::GetStatusForDevice( |
| const std::string& device_id, |
| secure_channel::SecureChannel::Status* status) const { |
| const auto iter = device_id_map_.find(device_id); |
| if (iter == device_id_map_.end()) |
| return false; |
| |
| *status = iter->second.status; |
| return true; |
| } |
| |
| } // namespace tether |
| |
| } // namespace chromeos |