blob: 7ac5dc22462b4bb506d45c274e535a613617c3c5 [file]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/quick_pair/repository/fake_fast_pair_repository.h"
#include "ash/quick_pair/common/logging.h"
#include "ash/quick_pair/proto/fastpair.pb.h"
#include "base/base64.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "chromeos/ash/services/bluetooth_config/public/cpp/device_image_info.h"
#include "device/bluetooth/bluetooth_device.h"
namespace ash {
namespace quick_pair {
FakeFastPairRepository::FakeFastPairRepository() {
SetInstanceForTesting(this);
}
FakeFastPairRepository::~FakeFastPairRepository() {
SetInstanceForTesting(nullptr);
}
void FakeFastPairRepository::SetFakeMetadata(const std::string& hex_model_id,
nearby::fastpair::Device metadata,
gfx::Image image) {
nearby::fastpair::GetObservedDeviceResponse response;
response.mutable_device()->CopyFrom(metadata);
data_[base::ToUpperASCII(hex_model_id)] =
std::make_unique<DeviceMetadata>(response, image);
}
void FakeFastPairRepository::ClearFakeMetadata(
const std::string& hex_model_id) {
data_.erase(base::ToUpperASCII(hex_model_id));
}
void FakeFastPairRepository::SetCheckAccountKeysResult(
std::optional<PairingMetadata> result) {
check_account_keys_result_ = result;
}
bool FakeFastPairRepository::HasKeyForDevice(const std::string& mac_address) {
return saved_account_keys_.contains(mac_address);
}
bool FakeFastPairRepository::HasNameForDevice(const std::string& mac_address) {
return saved_display_names_.contains(mac_address);
}
void FakeFastPairRepository::GetDeviceMetadata(
const std::string& hex_model_id,
DeviceMetadataCallback callback) {
if (!is_network_connected_) {
std::move(callback).Run(/*device=*/nullptr, /*has_retryable_error=*/true);
return;
}
std::string normalized_id = base::ToUpperASCII(hex_model_id);
if (data_.contains(normalized_id)) {
std::move(callback).Run(data_[normalized_id].get(),
/*has_retryable_error=*/false);
return;
}
std::move(callback).Run(nullptr, /*has_retryable_error=*/true);
}
void FakeFastPairRepository::CheckAccountKeys(
const AccountKeyFilter& account_key_filter,
CheckAccountKeysCallback callback) {
std::move(callback).Run(check_account_keys_result_);
}
void FakeFastPairRepository::WriteAccountAssociationToFootprints(
scoped_refptr<Device> device,
const std::vector<uint8_t>& account_key) {
saved_account_keys_.insert_or_assign(device->classic_address().value(),
account_key);
saved_display_names_.insert_or_assign(device->classic_address().value(),
device->display_name().value());
}
bool FakeFastPairRepository::WriteAccountAssociationToLocalRegistry(
scoped_refptr<Device> device) {
std::vector<uint8_t> fake_account_key;
saved_account_keys_[device->classic_address().value()] = fake_account_key;
return true;
}
void FakeFastPairRepository::DeleteAssociatedDevice(
const std::string& mac_address,
DeleteAssociatedDeviceCallback callback) {
std::move(callback).Run(saved_account_keys_.erase(mac_address) == 1);
}
void FakeFastPairRepository::SetOptInStatus(
nearby::fastpair::OptInStatus status) {
status_ = status;
}
nearby::fastpair::OptInStatus FakeFastPairRepository::GetOptInStatus() {
return status_;
}
// Unimplemented.
void FakeFastPairRepository::CheckOptInStatus(
CheckOptInStatusCallback callback) {
std::move(callback).Run(status_);
}
void FakeFastPairRepository::DeleteAssociatedDeviceByAccountKey(
const std::vector<uint8_t>& account_key,
DeleteAssociatedDeviceByAccountKeyCallback callback) {
for (auto it = devices_.begin(); it != devices_.end(); it++) {
if (it->has_account_key() &&
base::HexEncode(it->account_key()) == base::HexEncode(account_key)) {
devices_.erase(it);
std::move(callback).Run(/*success=*/true);
return;
}
}
std::move(callback).Run(/*success=*/false);
}
void FakeFastPairRepository::UpdateAssociatedDeviceFootprintsName(
const std::string& mac_address,
const std::string& display_name,
bool cache_may_be_stale) {
saved_display_names_.insert_or_assign(mac_address, display_name);
}
void FakeFastPairRepository::UpdateOptInStatus(
nearby::fastpair::OptInStatus opt_in_status,
UpdateOptInStatusCallback callback) {
status_ = opt_in_status;
std::move(callback).Run(/*success=*/true);
}
// Unimplemented.
void FakeFastPairRepository::FetchDeviceImages(scoped_refptr<Device> device) {
return;
}
// Unimplemented.
std::optional<std::string>
FakeFastPairRepository::GetDeviceDisplayNameFromCache(
std::vector<uint8_t> account_key) {
return std::nullopt;
}
bool FakeFastPairRepository::IsAccountKeyPairedLocally(
const std::vector<uint8_t>& account_key) {
return is_account_key_paired_locally_;
}
// Unimplemented.
bool FakeFastPairRepository::PersistDeviceImages(scoped_refptr<Device> device) {
return true;
}
// Unimplemented.
bool FakeFastPairRepository::EvictDeviceImages(const std::string& mac_address) {
return true;
}
// Unimplemented.
std::optional<bluetooth_config::DeviceImageInfo>
FakeFastPairRepository::GetImagesForDevice(const std::string& mac_address) {
return std::nullopt;
}
void FakeFastPairRepository::SetSavedDevices(
nearby::fastpair::OptInStatus status,
std::vector<nearby::fastpair::FastPairDevice> devices) {
status_ = status;
devices_ = std::move(devices);
}
void FakeFastPairRepository::GetSavedDevices(GetSavedDevicesCallback callback) {
std::move(callback).Run(status_, devices_);
}
void FakeFastPairRepository::SaveMacAddressToAccount(
const std::string& mac_address) {
saved_mac_addresses_.insert(mac_address);
}
void FakeFastPairRepository::IsDeviceSavedToAccount(
const std::string& mac_address,
IsDeviceSavedToAccountCallback callback) {
if (saved_to_account_callback_is_delayed_) {
saved_to_account_callback_ = std::move(callback);
return;
}
if (saved_mac_addresses_.contains(mac_address)) {
std::move(callback).Run(true);
return;
}
std::move(callback).Run(false);
}
void FakeFastPairRepository::TriggerIsDeviceSavedToAccountCallback() {
std::move(saved_to_account_callback_).Run(false);
}
} // namespace quick_pair
} // namespace ash