blob: c50afa946914e7999e2b7a06daa78865245ae10e [file] [log] [blame]
// 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 "components/strike_database/test_inmemory_strike_database.h"
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include "base/metrics/histogram_functions.h"
#include "base/time/time.h"
#include "components/strike_database/strike_data.pb.h"
namespace strike_database {
TestInMemoryStrikeDatabase::TestInMemoryStrikeDatabase() = default;
TestInMemoryStrikeDatabase::~TestInMemoryStrikeDatabase() = default;
int TestInMemoryStrikeDatabase::AddStrikes(int strikes_increase,
const std::string& key) {
DCHECK_GT(strikes_increase, 0);
int num_strikes =
strike_map_cache_.contains(key)
? strike_map_cache_[key].num_strikes() + strikes_increase
: strikes_increase;
SetStrikeData(key, num_strikes);
return num_strikes;
}
int TestInMemoryStrikeDatabase::RemoveStrikes(int strikes_decrease,
const std::string& key) {
int num_strikes = GetStrikes(key);
num_strikes = std::max(0, num_strikes - strikes_decrease);
SetStrikeData(key, num_strikes);
return num_strikes;
}
int TestInMemoryStrikeDatabase::GetStrikes(const std::string& key) {
auto iter = strike_map_cache_.find(key);
return (iter != strike_map_cache_.end()) ? iter->second.num_strikes() : 0;
}
void TestInMemoryStrikeDatabase::ClearStrikes(const std::string& key) {
strike_map_cache_.erase(key);
}
std::map<std::string, StrikeData>&
TestInMemoryStrikeDatabase::GetStrikeCache() {
return strike_map_cache_;
}
std::vector<std::string> TestInMemoryStrikeDatabase::GetAllStrikeKeysForProject(
const std::string& project_prefix) {
std::vector<std::string> project_keys;
for (const auto& [key, data] : strike_map_cache_) {
if (key.find(project_prefix) == 0) {
project_keys.push_back(key);
}
}
return project_keys;
}
void TestInMemoryStrikeDatabase::ClearAllStrikesForProject(
const std::string& project_prefix) {
ClearStrikesForKeys(GetAllStrikeKeysForProject(project_prefix));
}
void TestInMemoryStrikeDatabase::ClearStrikesForKeys(
const std::vector<std::string>& keys_to_remove) {
for (const auto& key : keys_to_remove) {
strike_map_cache_.erase(key);
}
}
void TestInMemoryStrikeDatabase::ClearAllStrikes() {
strike_map_cache_.clear();
}
std::string TestInMemoryStrikeDatabase::GetPrefixFromKey(
const std::string& key) const {
return key.substr(0, key.find(kKeyDeliminator));
}
void TestInMemoryStrikeDatabase::SetStrikeData(const std::string& key,
int num_strikes) {
if (num_strikes == 0) {
ClearStrikes(key);
return;
}
StrikeData data;
data.set_num_strikes(num_strikes);
data.set_last_update_timestamp(
base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds());
strike_map_cache_[key] = data;
}
base::Time TestInMemoryStrikeDatabase::GetLastUpdatedTimestamp(
const std::string& key) {
auto iter = strike_map_cache_.find(key);
return iter != strike_map_cache_.end()
? base::Time::FromDeltaSinceWindowsEpoch(
base::Microseconds(iter->second.last_update_timestamp()))
: base::Time();
}
} // namespace strike_database