diff options
Diffstat (limited to 'base/test/test_reg_util_win.cc')
-rw-r--r-- | base/test/test_reg_util_win.cc | 99 |
1 files changed, 68 insertions, 31 deletions
diff --git a/base/test/test_reg_util_win.cc b/base/test/test_reg_util_win.cc index e23c6e9..96936b8 100644 --- a/base/test/test_reg_util_win.cc +++ b/base/test/test_reg_util_win.cc @@ -4,23 +4,67 @@ #include "base/test/test_reg_util_win.h" +#include "base/guid.h" #include "base/logging.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "testing/gtest/include/gtest/gtest.h" namespace registry_util { -const wchar_t RegistryOverrideManager::kTempTestKeyPath[] = - L"Software\\Chromium\\TempTestKeys"; +namespace { + +const wchar_t kTimestampDelimiter[] = L"$"; +const wchar_t kTempTestKeyPath[] = L"Software\\Chromium\\TempTestKeys"; + +void DeleteStaleTestKeys(const base::Time& now, const string16& test_key_root) { + base::win::RegKey test_root_key; + if (test_root_key.Open(HKEY_CURRENT_USER, + test_key_root.c_str(), + KEY_ALL_ACCESS) != ERROR_SUCCESS) { + // This will occur on first-run, but is harmless. + return; + } + + base::win::RegistryKeyIterator iterator_test_root_key(HKEY_CURRENT_USER, + test_key_root.c_str()); + for (; iterator_test_root_key.Valid(); ++iterator_test_root_key) { + string16 key_name = iterator_test_root_key.Name(); + std::vector<string16> tokens; + Tokenize(key_name, string16(kTimestampDelimiter), &tokens); + int64 key_name_as_number = 0; + + if (!base::StringToInt64(tokens[0], &key_name_as_number)) { + test_root_key.DeleteKey(key_name.c_str()); + continue; + } + + base::Time key_time = base::Time::FromInternalValue(key_name_as_number); + base::TimeDelta age = now - key_time; + + if (age > base::TimeDelta::FromHours(24)) + test_root_key.DeleteKey(key_name.c_str()); + } +} + +string16 GenerateTempKeyPath(const string16& test_key_root, + const base::Time& timestamp) { + string16 key_path = test_key_root; + key_path += L"\\" + base::Int64ToString16(timestamp.ToInternalValue()); + key_path += kTimestampDelimiter + base::ASCIIToWide(base::GenerateGUID()); + + return key_path; +} + +} // namespace RegistryOverrideManager::ScopedRegistryKeyOverride::ScopedRegistryKeyOverride( HKEY override, - const std::wstring& temp_name) - : override_(override), - temp_name_(temp_name) { - DCHECK(!temp_name_.empty()); - std::wstring key_path(RegistryOverrideManager::kTempTestKeyPath); - key_path += L"\\" + temp_name_; - EXPECT_EQ(ERROR_SUCCESS, + const string16& key_path) + : override_(override) { + EXPECT_EQ( + ERROR_SUCCESS, temp_key_.Create(HKEY_CURRENT_USER, key_path.c_str(), KEY_ALL_ACCESS)); EXPECT_EQ(ERROR_SUCCESS, ::RegOverridePredefKey(override_, temp_key_.Handle())); @@ -29,37 +73,30 @@ RegistryOverrideManager::ScopedRegistryKeyOverride::ScopedRegistryKeyOverride( RegistryOverrideManager:: ScopedRegistryKeyOverride::~ScopedRegistryKeyOverride() { ::RegOverridePredefKey(override_, NULL); - // The temp key will be deleted via a call to DeleteAllTempKeys(). -} - -RegistryOverrideManager::RegistryOverrideManager() { - DeleteAllTempKeys(); + temp_key_.DeleteKey(L""); } -RegistryOverrideManager::~RegistryOverrideManager() { - RemoveAllOverrides(); +RegistryOverrideManager::RegistryOverrideManager() + : timestamp_(base::Time::Now()), test_key_root_(kTempTestKeyPath) { + DeleteStaleTestKeys(timestamp_, test_key_root_); } -void RegistryOverrideManager::OverrideRegistry(HKEY override, - const std::wstring& temp_name) { - overrides_.push_back(new ScopedRegistryKeyOverride(override, temp_name)); +RegistryOverrideManager::RegistryOverrideManager(const base::Time& timestamp, + const string16& test_key_root) + : timestamp_(timestamp), test_key_root_(test_key_root) { + DeleteStaleTestKeys(timestamp_, test_key_root_); } -void RegistryOverrideManager::RemoveAllOverrides() { - while (!overrides_.empty()) { - delete overrides_.back(); - overrides_.pop_back(); - } +RegistryOverrideManager::~RegistryOverrideManager() {} - DeleteAllTempKeys(); +void RegistryOverrideManager::OverrideRegistry(HKEY override, + const string16& override_name) { + string16 key_path = GenerateTempKeyPath(test_key_root_, timestamp_); + overrides_.push_back(new ScopedRegistryKeyOverride(override, key_path)); } -// static -void RegistryOverrideManager::DeleteAllTempKeys() { - base::win::RegKey key; - if (key.Open(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS) == ERROR_SUCCESS) { - key.DeleteKey(kTempTestKeyPath); - } +string16 GenerateTempKeyPath() { + return GenerateTempKeyPath(string16(kTempTestKeyPath), base::Time::Now()); } } // namespace registry_util |