// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "sharing/internal/test/fake_preference_manager.h" #include #include #include #include #include #include #include #include "absl/container/flat_hash_map.h" #include "absl/strings/string_view.h" #include "absl/synchronization/mutex.h" #include "absl/time/time.h" #include "absl/types/span.h" #include "sharing/internal/api/private_certificate_data.h" namespace nearby { using ::nearby::sharing::api::PrivateCertificateData; template void FakePreferenceManager::SetValue(absl::string_view key, T value) { { absl::MutexLock lock(mutex_); if (values_.contains(key)) { const Data& data = values_.at(key); if (std::holds_alternative(data)) { if (std::get(data) == value) { return; } } values_.erase(key); } values_.emplace(key, value); } NotifyPreferenceChanged(key); } template T FakePreferenceManager::GetValue(absl::string_view key, const T& default_value) const { absl::MutexLock lock(mutex_); if (values_.contains(key)) { const Data& data = values_.at(key); if (std::holds_alternative(data)) { return std::get(data); } } return default_value; } template void FakePreferenceManager::SetArray(absl::string_view key, absl::Span values) { std::vector data; data.reserve(values.size()); for (T value : values) { data.push_back(value); } { absl::MutexLock lock(mutex_); if (arrays_.contains(key)) { if (data == arrays_.at(key)) { return; } arrays_.erase(key); } arrays_.emplace(key, data); } NotifyPreferenceChanged(key); } template std::vector FakePreferenceManager::GetArray( absl::string_view key, absl::Span default_value) const { absl::MutexLock lock(mutex_); if (arrays_.contains(key)) { const std::vector& data = arrays_.at(key); std::vector result; result.reserve(data.size()); for (const Data& data : data) { if (std::holds_alternative(data)) { result.push_back(std::get(data)); } } return result; } return std::vector(default_value.begin(), default_value.end()); } template void FakePreferenceManager::SetDictionaryValue( absl::string_view key, absl::string_view dictionary_item, T value) { { absl::MutexLock lock(mutex_); auto& dictionary = dictionaries_[key]; if (dictionary.contains(dictionary_item)) { const Data& data = dictionary.at(dictionary_item); if (std::holds_alternative(data)) { if (std::get(data) == value) { return; } } dictionary.erase(dictionary_item); } dictionary.emplace(dictionary_item, value); } NotifyPreferenceChanged(key); } template std::optional FakePreferenceManager::GetDictionaryValue( absl::string_view key, absl::string_view dictionary_item) const { absl::MutexLock lock(mutex_); if (!dictionaries_.contains(key)) { return std::nullopt; } const auto& dictionary = dictionaries_.at(key); if (dictionary.contains(dictionary_item)) { const Data& data = dictionary.at(dictionary_item); if (std::holds_alternative(data)) { return std::get(data); } } return std::nullopt; } void FakePreferenceManager::SetBoolean(absl::string_view key, bool value) { SetValue(key, value); } void FakePreferenceManager::SetInteger(absl::string_view key, int value) { SetValue(key, value); } void FakePreferenceManager::SetInt64(absl::string_view key, int64_t value) { SetValue(key, value); } void FakePreferenceManager::SetString(absl::string_view key, absl::string_view value) { SetValue(key, std::string(value)); } void FakePreferenceManager::SetTime(absl::string_view key, absl::Time value) { SetValue(key, absl::ToUnixNanos(value)); } void FakePreferenceManager::SetBooleanArray(absl::string_view key, absl::Span value) { SetArray(key, value); } void FakePreferenceManager::SetIntegerArray(absl::string_view key, absl::Span value) { SetArray(key, value); } void FakePreferenceManager::SetInt64Array(absl::string_view key, absl::Span value) { SetArray(key, value); } void FakePreferenceManager::SetStringArray( absl::string_view key, absl::Span value) { SetArray(key, value); } void FakePreferenceManager::SetPrivateCertificateArray( absl::string_view key, absl::Span value) { absl::MutexLock lock(mutex_); if (certs_.contains(key)) { certs_.erase(key); } certs_.emplace( key, std::vector(value.begin(), value.end())); } void FakePreferenceManager::SetCertificateExpirationArray( absl::string_view key, absl::Span> value) { absl::MutexLock lock(mutex_); if (cert_expirations_.contains(key)) { cert_expirations_.erase(key); } cert_expirations_.emplace(key, std::vector>( value.begin(), value.end())); } void FakePreferenceManager::SetDictionaryBooleanValue( absl::string_view key, absl::string_view dictionary_item, bool value) { SetDictionaryValue(key, dictionary_item, value); } void FakePreferenceManager::SetDictionaryIntegerValue( absl::string_view key, absl::string_view dictionary_item, int value) { SetDictionaryValue(key, dictionary_item, value); } void FakePreferenceManager::SetDictionaryInt64Value( absl::string_view key, absl::string_view dictionary_item, int64_t value) { SetDictionaryValue(key, dictionary_item, value); } void FakePreferenceManager::SetDictionaryStringValue( absl::string_view key, absl::string_view dictionary_item, std::string value) { SetDictionaryValue(key, dictionary_item, value); } void FakePreferenceManager::RemoveDictionaryItem( absl::string_view key, absl::string_view dictionary_item) { { absl::MutexLock lock(mutex_); if (!dictionaries_.contains(key)) { return; } auto& dictionary = dictionaries_[key]; dictionary.erase(dictionary_item); } NotifyPreferenceChanged(key); } bool FakePreferenceManager::GetBoolean(absl::string_view key, bool default_value) const { return GetValue(key, default_value); } int FakePreferenceManager::GetInteger(absl::string_view key, int default_value) const { return GetValue(key, default_value); } int64_t FakePreferenceManager::GetInt64(absl::string_view key, int64_t default_value) const { return GetValue(key, default_value); } std::string FakePreferenceManager::GetString( absl::string_view key, const std::string& default_value) const { return GetValue(key, default_value); } absl::Time FakePreferenceManager::GetTime(absl::string_view key, absl::Time default_value) const { return absl::FromUnixNanos(GetValue(key, absl::ToUnixNanos(default_value))); } std::vector FakePreferenceManager::GetBooleanArray( absl::string_view key, absl::Span default_value) const { return GetArray(key, default_value); } std::vector FakePreferenceManager::GetIntegerArray( absl::string_view key, absl::Span default_value) const { return GetArray(key, default_value); } std::vector FakePreferenceManager::GetInt64Array( absl::string_view key, absl::Span default_value) const { return GetArray(key, default_value); } std::vector FakePreferenceManager::GetStringArray( absl::string_view key, absl::Span default_value) const { return GetArray(key, default_value); } std::vector FakePreferenceManager::GetPrivateCertificateArray(absl::string_view key) const { absl::MutexLock lock(mutex_); if (certs_.contains(key)) { return certs_.at(key); } return std::vector(); } std::vector> FakePreferenceManager::GetCertificateExpirationArray( absl::string_view key) const { absl::MutexLock lock(mutex_); if (cert_expirations_.contains(key)) { return cert_expirations_.at(key); } return std::vector>(); } std::optional FakePreferenceManager::GetDictionaryBooleanValue( absl::string_view key, absl::string_view dictionary_item) const { return GetDictionaryValue(key, dictionary_item); } std::optional FakePreferenceManager::GetDictionaryIntegerValue( absl::string_view key, absl::string_view dictionary_item) const { return GetDictionaryValue(key, dictionary_item); } std::optional FakePreferenceManager::GetDictionaryInt64Value( absl::string_view key, absl::string_view dictionary_item) const { return GetDictionaryValue(key, dictionary_item); } std::optional FakePreferenceManager::GetDictionaryStringValue( absl::string_view key, absl::string_view dictionary_item) const { return GetDictionaryValue(key, dictionary_item); } void FakePreferenceManager::Remove(absl::string_view key) { { absl::MutexLock lock(mutex_); values_.erase(key); arrays_.erase(key); dictionaries_.erase(key); } NotifyPreferenceChanged(key); } void FakePreferenceManager::NotifyPreferenceChanged(absl::string_view key) { absl::flat_hash_map> observers; { absl::MutexLock lock(mutex_); observers = observers_; } for (const auto& observer : observers) { observer.second(key); } } void FakePreferenceManager::AddObserver( absl::string_view name, std::function observer) { absl::MutexLock lock(mutex_); observers_.emplace(name, observer); } void FakePreferenceManager::RemoveObserver(absl::string_view name) { absl::MutexLock lock(mutex_); observers_.erase(name); } } // namespace nearby