blob: 216d58ea11116b40b96f1572315f474cdb5f99a1 [file] [log] [blame]
Daniel Eratb8cf9492015-07-06 13:18:13 -06001// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/compiler_specific.h"
6#include "base/memory/scoped_ptr.h"
7#include "base/strings/string_number_conversions.h"
8#include "base/strings/utf_string_conversions.h"
9#include "base/test/test_reg_util_win.h"
10#include "base/time/time.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace registry_util {
14
15namespace {
16const wchar_t kTestKeyPath[] = L"Software\\Chromium\\Foo\\Baz\\TestKey";
17const wchar_t kTestValueName[] = L"TestValue";
18} // namespace
19
20class RegistryOverrideManagerTest : public testing::Test {
21 protected:
22 RegistryOverrideManagerTest() {
23 // We assign a fake test key path to our test RegistryOverrideManager
24 // so we don't interfere with any actual RegistryOverrideManagers running
25 // on the system. This fake path will be auto-deleted by other
26 // RegistryOverrideManagers in case we crash.
27 fake_test_key_root_ = registry_util::GenerateTempKeyPath();
28
29 // Ensure a clean test environment.
30 base::win::RegKey key(HKEY_CURRENT_USER);
31 key.DeleteKey(fake_test_key_root_.c_str());
32 key.DeleteKey(kTestKeyPath);
33 }
34
35 ~RegistryOverrideManagerTest() override {
36 base::win::RegKey key(HKEY_CURRENT_USER);
37 key.DeleteKey(fake_test_key_root_.c_str());
38 }
39
40 void AssertKeyExists(const base::string16& key_path) {
41 base::win::RegKey key;
42 ASSERT_EQ(ERROR_SUCCESS,
43 key.Open(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ))
44 << key_path << " does not exist.";
45 }
46
47 void AssertKeyAbsent(const base::string16& key_path) {
48 base::win::RegKey key;
49 ASSERT_NE(ERROR_SUCCESS,
50 key.Open(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ))
51 << key_path << " exists but it should not.";
52 }
53
54 void CreateKey(const base::string16& key_path) {
55 base::win::RegKey key;
56 EXPECT_EQ(ERROR_SUCCESS,
57 key.Create(HKEY_CURRENT_USER, key_path.c_str(), KEY_ALL_ACCESS));
58 }
59
60 base::string16 FakeOverrideManagerPath(const base::Time& time) {
61 return fake_test_key_root_ + L"\\" +
62 base::Int64ToString16(time.ToInternalValue());
63 }
64
65 void CreateManager(const base::Time& timestamp) {
66 manager_.reset(new RegistryOverrideManager(timestamp, fake_test_key_root_));
67 manager_->OverrideRegistry(HKEY_CURRENT_USER);
68 }
69
70 base::string16 fake_test_key_root_;
71 scoped_ptr<RegistryOverrideManager> manager_;
72};
73
74TEST_F(RegistryOverrideManagerTest, Basic) {
75 CreateManager(base::Time::Now());
76
77 base::win::RegKey create_key;
78 EXPECT_EQ(ERROR_SUCCESS,
79 create_key.Create(HKEY_CURRENT_USER, kTestKeyPath, KEY_ALL_ACCESS));
80 EXPECT_TRUE(create_key.Valid());
81 EXPECT_EQ(ERROR_SUCCESS, create_key.WriteValue(kTestValueName, 42));
82 create_key.Close();
83
84 AssertKeyExists(kTestKeyPath);
85
86 DWORD value;
87 base::win::RegKey read_key;
88 EXPECT_EQ(ERROR_SUCCESS,
89 read_key.Open(HKEY_CURRENT_USER, kTestKeyPath, KEY_READ));
90 EXPECT_TRUE(read_key.Valid());
91 EXPECT_EQ(ERROR_SUCCESS, read_key.ReadValueDW(kTestValueName, &value));
92 EXPECT_EQ(42, value);
93 read_key.Close();
94
95 manager_.reset();
96
97 AssertKeyAbsent(kTestKeyPath);
98}
99
100TEST_F(RegistryOverrideManagerTest, DeleteStaleKeys) {
101 base::Time::Exploded kTestTimeExploded = {2013, 11, 1, 4, 0, 0, 0, 0};
102 base::Time kTestTime = base::Time::FromUTCExploded(kTestTimeExploded);
103
104 base::string16 path_garbage = fake_test_key_root_ + L"\\Blah";
105 base::string16 path_very_stale =
106 FakeOverrideManagerPath(kTestTime - base::TimeDelta::FromDays(100));
107 base::string16 path_stale =
108 FakeOverrideManagerPath(kTestTime - base::TimeDelta::FromDays(5));
109 base::string16 path_current =
110 FakeOverrideManagerPath(kTestTime - base::TimeDelta::FromMinutes(1));
111 base::string16 path_future =
112 FakeOverrideManagerPath(kTestTime + base::TimeDelta::FromMinutes(1));
113
114 CreateKey(path_garbage);
115 CreateKey(path_very_stale);
116 CreateKey(path_stale);
117 CreateKey(path_current);
118 CreateKey(path_future);
119
120 CreateManager(kTestTime);
121 manager_.reset();
122
123 AssertKeyAbsent(path_garbage);
124 AssertKeyAbsent(path_very_stale);
125 AssertKeyAbsent(path_stale);
126 AssertKeyExists(path_current);
127 AssertKeyExists(path_future);
128}
129
130} // namespace registry_util