Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(274)

Side by Side Diff: chrome/installer/util/set_reg_value_work_item_unittest.cc

Issue 1220473002: Introduce a SetRegValueWorkItem overload that accepts a callback instead (...) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: adopt grt's suggestion Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/installer/util/set_reg_value_work_item.cc ('k') | chrome/installer/util/work_item.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <windows.h> 5 #include <windows.h>
6 6
7 #include <string>
8
9 #include "base/bind.h"
7 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/macros.h"
8 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/test/test_reg_util_win.h"
10 #include "base/win/registry.h" 15 #include "base/win/registry.h"
11 #include "chrome/installer/util/set_reg_value_work_item.h" 16 #include "chrome/installer/util/set_reg_value_work_item.h"
12 #include "chrome/installer/util/work_item.h" 17 #include "chrome/installer/util/work_item.h"
13 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
14 19
15 using base::win::RegKey;
16
17 namespace { 20 namespace {
18 21
19 const wchar_t kTestRoot[] = L"TempTemp"; 22 const wchar_t kTestKey[] = L"TempTemp";
20 const wchar_t kDataStr1[] = L"data_111"; 23 const wchar_t kDataStr1[] = L"data_111";
21 const wchar_t kDataStr2[] = L"data_222"; 24 const wchar_t kDataStr2[] = L"data_222";
22 const wchar_t kNameStr[] = L"name_str"; 25 const wchar_t kNameStr[] = L"name_str";
23 const wchar_t kNameDword[] = L"name_dword"; 26 const wchar_t kNameDword[] = L"name_dword";
24 27
25 const DWORD dword1 = 0; 28 const DWORD kDword1 = 12345;
26 const DWORD dword2 = 1; 29 const DWORD kDword2 = 6789;
27 30
28 class SetRegValueWorkItemTest : public testing::Test { 31 class SetRegValueWorkItemTest : public testing::Test {
29 protected: 32 protected:
33 SetRegValueWorkItemTest() {}
34
30 void SetUp() override { 35 void SetUp() override {
31 // Create a temporary key for testing 36 registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER);
32 RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS); 37
33 key.DeleteKey(kTestRoot); 38 // Create a temporary key for testing.
34 ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kTestRoot, KEY_READ)); 39 ASSERT_NE(ERROR_SUCCESS,
35 ASSERT_EQ(ERROR_SUCCESS, 40 test_key_.Open(HKEY_CURRENT_USER, kTestKey, KEY_READ));
36 key.Create(HKEY_CURRENT_USER, kTestRoot, KEY_READ)); 41 ASSERT_EQ(ERROR_SUCCESS, test_key_.Create(HKEY_CURRENT_USER, kTestKey,
42 KEY_READ | KEY_SET_VALUE));
37 } 43 }
38 void TearDown() override { 44
39 logging::CloseLogFile(); 45 base::win::RegKey test_key_;
40 // Clean up the temporary key 46
41 RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS); 47 private:
42 ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kTestRoot)); 48 registry_util::RegistryOverrideManager registry_override_manager_;
43 } 49
50 DISALLOW_COPY_AND_ASSIGN(SetRegValueWorkItemTest);
44 }; 51 };
45 52
46 } // namespace 53 } // namespace
47 54
48 // Write a new value without overwrite flag. The value should be set. 55 // Write a new value without overwrite flag. The value should be set.
49 TEST_F(SetRegValueWorkItemTest, WriteNewNonOverwrite) { 56 TEST_F(SetRegValueWorkItemTest, WriteNewNonOverwrite) {
50 RegKey key;
51
52 std::wstring parent_key(kTestRoot);
53 parent_key.append(&base::FilePath::kSeparators[0], 1);
54 parent_key.append(L"WriteNewNonOverwrite");
55 ASSERT_EQ(ERROR_SUCCESS,
56 key.Create(HKEY_CURRENT_USER, parent_key.c_str(), KEY_READ));
57
58 std::wstring name_str(kNameStr);
59 std::wstring data_str(kDataStr1);
60 scoped_ptr<SetRegValueWorkItem> work_item1( 57 scoped_ptr<SetRegValueWorkItem> work_item1(
61 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 58 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
62 parent_key, 59 kTestKey,
63 WorkItem::kWow64Default, 60 WorkItem::kWow64Default,
64 name_str, 61 kNameStr,
65 data_str, 62 kDataStr1,
66 false)); 63 false));
67 64
68 std::wstring name_dword(kNameDword);
69 scoped_ptr<SetRegValueWorkItem> work_item2( 65 scoped_ptr<SetRegValueWorkItem> work_item2(
70 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 66 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
71 parent_key, 67 kTestKey,
72 WorkItem::kWow64Default, 68 WorkItem::kWow64Default,
73 name_dword, 69 kNameDword,
74 dword1, 70 kDword1,
75 false)); 71 false));
76 72
77 EXPECT_TRUE(work_item1->Do()); 73 ASSERT_TRUE(work_item1->Do());
78 EXPECT_TRUE(work_item2->Do()); 74 ASSERT_TRUE(work_item2->Do());
79 75
80 std::wstring read_out; 76 std::wstring read_out;
81 DWORD read_dword; 77 DWORD read_dword;
82 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name_str.c_str(), &read_out)); 78 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
83 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(name_dword.c_str(), &read_dword)); 79 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameDword, &read_dword));
84 EXPECT_EQ(read_out, kDataStr1); 80 EXPECT_EQ(read_out, kDataStr1);
85 EXPECT_EQ(read_dword, dword1); 81 EXPECT_EQ(read_dword, kDword1);
86 82
87 work_item1->Rollback(); 83 work_item1->Rollback();
88 work_item2->Rollback(); 84 work_item2->Rollback();
89 85
90 // Rollback should delete the value. 86 // Rollback should delete the value.
91 EXPECT_FALSE(key.HasValue(name_str.c_str())); 87 EXPECT_FALSE(test_key_.HasValue(kNameStr));
92 EXPECT_FALSE(key.HasValue(name_dword.c_str())); 88 EXPECT_FALSE(test_key_.HasValue(kNameDword));
93 } 89 }
94 90
95 // Write a new value with overwrite flag. The value should be set. 91 // Write a new value with overwrite flag. The value should be set.
96 TEST_F(SetRegValueWorkItemTest, WriteNewOverwrite) { 92 TEST_F(SetRegValueWorkItemTest, WriteNewOverwrite) {
97 RegKey key;
98
99 std::wstring parent_key(kTestRoot);
100 parent_key.append(&base::FilePath::kSeparators[0], 1);
101 parent_key.append(L"WriteNewOverwrite");
102 ASSERT_EQ(ERROR_SUCCESS,
103 key.Create(HKEY_CURRENT_USER, parent_key.c_str(), KEY_READ));
104
105 std::wstring name_str(kNameStr);
106 std::wstring data_str(kDataStr1);
107 scoped_ptr<SetRegValueWorkItem> work_item1( 93 scoped_ptr<SetRegValueWorkItem> work_item1(
108 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 94 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
109 parent_key, 95 kTestKey,
110 WorkItem::kWow64Default, 96 WorkItem::kWow64Default,
111 name_str, 97 kNameStr,
112 data_str, 98 kDataStr1,
113 true)); 99 true));
114 100
115 std::wstring name_dword(kNameDword);
116 scoped_ptr<SetRegValueWorkItem> work_item2( 101 scoped_ptr<SetRegValueWorkItem> work_item2(
117 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 102 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
118 parent_key, 103 kTestKey,
119 WorkItem::kWow64Default, 104 WorkItem::kWow64Default,
120 name_dword, 105 kNameDword,
121 dword1, 106 kDword1,
122 true)); 107 true));
123 108
124 EXPECT_TRUE(work_item1->Do()); 109 ASSERT_TRUE(work_item1->Do());
125 EXPECT_TRUE(work_item2->Do()); 110 ASSERT_TRUE(work_item2->Do());
126 111
127 std::wstring read_out; 112 std::wstring read_out;
128 DWORD read_dword; 113 DWORD read_dword;
129 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name_str.c_str(), &read_out)); 114 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
130 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(name_dword.c_str(), &read_dword)); 115 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameDword, &read_dword));
131 EXPECT_EQ(read_out, kDataStr1); 116 EXPECT_EQ(read_out, kDataStr1);
132 EXPECT_EQ(read_dword, dword1); 117 EXPECT_EQ(read_dword, kDword1);
133 118
134 work_item1->Rollback(); 119 work_item1->Rollback();
135 work_item2->Rollback(); 120 work_item2->Rollback();
136 121
137 // Rollback should delete the value. 122 // Rollback should delete the value.
138 EXPECT_FALSE(key.HasValue(name_str.c_str())); 123 EXPECT_FALSE(test_key_.HasValue(kNameStr));
139 EXPECT_FALSE(key.HasValue(name_dword.c_str())); 124 EXPECT_FALSE(test_key_.HasValue(kNameDword));
140 } 125 }
141 126
142 // Write to an existing value without overwrite flag. There should be 127 // Write to an existing value without overwrite flag. There should be
143 // no change. 128 // no change.
144 TEST_F(SetRegValueWorkItemTest, WriteExistingNonOverwrite) { 129 TEST_F(SetRegValueWorkItemTest, WriteExistingNonOverwrite) {
145 RegKey key;
146
147 std::wstring parent_key(kTestRoot);
148 parent_key.append(&base::FilePath::kSeparators[0], 1);
149 parent_key.append(L"WriteExistingNonOverwrite");
150 ASSERT_EQ(ERROR_SUCCESS,
151 key.Create(HKEY_CURRENT_USER, parent_key.c_str(),
152 KEY_READ | KEY_SET_VALUE));
153
154 // First test REG_SZ value. 130 // First test REG_SZ value.
155 // Write data to the value we are going to set. 131 // Write data to the value we are going to set.
156 std::wstring name(kNameStr); 132 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameStr, kDataStr1));
157 ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(name.c_str(), kDataStr1)); 133
158 134 scoped_ptr<SetRegValueWorkItem> work_item(
159 std::wstring data(kDataStr2); 135 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
160 scoped_ptr<SetRegValueWorkItem> work_item( 136 kTestKey,
161 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 137 WorkItem::kWow64Default,
162 parent_key, 138 kNameStr,
163 WorkItem::kWow64Default, 139 kDataStr2,
164 name,
165 data,
166 false)); 140 false));
167 EXPECT_TRUE(work_item->Do()); 141 ASSERT_TRUE(work_item->Do());
168 142
169 std::wstring read_out; 143 std::wstring read_out;
170 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 144 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
171 EXPECT_EQ(0, read_out.compare(kDataStr1)); 145 EXPECT_EQ(read_out, kDataStr1);
172 146
173 work_item->Rollback(); 147 work_item->Rollback();
174 EXPECT_TRUE(key.HasValue(name.c_str())); 148 EXPECT_TRUE(test_key_.HasValue(kNameStr));
175 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 149 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
176 EXPECT_EQ(read_out, kDataStr1); 150 EXPECT_EQ(read_out, kDataStr1);
177 151
178 // Now test REG_DWORD value. 152 // Now test REG_DWORD value.
179 // Write data to the value we are going to set. 153 // Write data to the value we are going to set.
180 name.assign(kNameDword); 154 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameDword, kDword1));
181 ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(name.c_str(), dword1));
182 work_item.reset(WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 155 work_item.reset(WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
183 parent_key, 156 kTestKey,
184 WorkItem::kWow64Default, 157 WorkItem::kWow64Default,
185 name, 158 kNameDword,
186 dword2, 159 kDword2,
187 false)); 160 false));
188 EXPECT_TRUE(work_item->Do()); 161 ASSERT_TRUE(work_item->Do());
189 162
190 DWORD read_dword; 163 DWORD read_dword;
191 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(name.c_str(), &read_dword)); 164 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameDword, &read_dword));
192 EXPECT_EQ(read_dword, dword1); 165 EXPECT_EQ(read_dword, kDword1);
193 166
194 work_item->Rollback(); 167 work_item->Rollback();
195 EXPECT_TRUE(key.HasValue(name.c_str())); 168 EXPECT_TRUE(test_key_.HasValue(kNameDword));
196 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(name.c_str(), &read_dword)); 169 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameDword, &read_dword));
197 EXPECT_EQ(read_dword, dword1); 170 EXPECT_EQ(read_dword, kDword1);
198 } 171 }
199 172
200 // Write to an existing value with overwrite flag. The value should be 173 // Write to an existing value with overwrite flag. The value should be
201 // overwritten. 174 // overwritten.
202 TEST_F(SetRegValueWorkItemTest, WriteExistingOverwrite) { 175 TEST_F(SetRegValueWorkItemTest, WriteExistingOverwrite) {
203 RegKey key;
204
205 std::wstring parent_key(kTestRoot);
206 parent_key.append(&base::FilePath::kSeparators[0], 1);
207 parent_key.append(L"WriteExistingOverwrite");
208 ASSERT_EQ(ERROR_SUCCESS,
209 key.Create(HKEY_CURRENT_USER, parent_key.c_str(),
210 KEY_READ | KEY_SET_VALUE));
211
212 // First test REG_SZ value. 176 // First test REG_SZ value.
213 // Write data to the value we are going to set. 177 // Write data to the value we are going to set.
214 std::wstring name(kNameStr); 178 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameStr, kDataStr1));
215 ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(name.c_str(), kDataStr1)); 179
216 180 const wchar_t kNameEmpty[] = L"name_empty";
217 std::wstring name_empty(L"name_empty"); 181 ASSERT_EQ(ERROR_SUCCESS, RegSetValueEx(test_key_.Handle(), kNameEmpty, NULL,
218 ASSERT_EQ(ERROR_SUCCESS, RegSetValueEx(key.Handle(), name_empty.c_str(), NULL,
219 REG_SZ, NULL, 0)); 182 REG_SZ, NULL, 0));
220 183
221 std::wstring data(kDataStr2);
222 scoped_ptr<SetRegValueWorkItem> work_item1( 184 scoped_ptr<SetRegValueWorkItem> work_item1(
223 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 185 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
224 parent_key, 186 kTestKey,
225 WorkItem::kWow64Default, 187 WorkItem::kWow64Default,
226 name, 188 kNameStr,
227 data, 189 kDataStr2,
228 true)); 190 true));
229 scoped_ptr<SetRegValueWorkItem> work_item2( 191 scoped_ptr<SetRegValueWorkItem> work_item2(
230 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 192 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
231 parent_key, 193 kTestKey,
232 WorkItem::kWow64Default, 194 WorkItem::kWow64Default,
233 name_empty, 195 kNameEmpty,
234 data, 196 kDataStr2,
235 true)); 197 true));
236 198
237 EXPECT_TRUE(work_item1->Do()); 199 ASSERT_TRUE(work_item1->Do());
238 EXPECT_TRUE(work_item2->Do()); 200 ASSERT_TRUE(work_item2->Do());
239 201
240 std::wstring read_out; 202 std::wstring read_out;
241 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 203 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
242 EXPECT_EQ(0, read_out.compare(kDataStr2)); 204 EXPECT_EQ(read_out, kDataStr2);
243 205
244 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name_empty.c_str(), &read_out)); 206 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameEmpty, &read_out));
245 EXPECT_EQ(0, read_out.compare(kDataStr2)); 207 EXPECT_EQ(read_out, kDataStr2);
246 208
247 work_item1->Rollback(); 209 work_item1->Rollback();
248 work_item2->Rollback(); 210 work_item2->Rollback();
249 211
250 EXPECT_TRUE(key.HasValue(name.c_str())); 212 EXPECT_TRUE(test_key_.HasValue(kNameStr));
251 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 213 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
252 EXPECT_EQ(read_out, kDataStr1); 214 EXPECT_EQ(read_out, kDataStr1);
253 215
254 DWORD type = 0; 216 DWORD type = 0;
255 DWORD size = 0; 217 DWORD size = 0;
256 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name_empty.c_str(), NULL, &size, 218 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameEmpty, NULL, &size, &type));
257 &type));
258 EXPECT_EQ(REG_SZ, type); 219 EXPECT_EQ(REG_SZ, type);
259 EXPECT_EQ(0, size); 220 EXPECT_EQ(0, size);
260 221
261 // Now test REG_DWORD value. 222 // Now test REG_DWORD value.
262 // Write data to the value we are going to set. 223 // Write data to the value we are going to set.
263 name.assign(kNameDword); 224 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameDword, kDword1));
264 ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(name.c_str(), dword1));
265 scoped_ptr<SetRegValueWorkItem> work_item3( 225 scoped_ptr<SetRegValueWorkItem> work_item3(
266 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 226 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
267 parent_key, 227 kTestKey,
268 WorkItem::kWow64Default, 228 WorkItem::kWow64Default,
269 name, 229 kNameDword,
270 dword2, 230 kDword2,
271 true)); 231 true));
272 EXPECT_TRUE(work_item3->Do()); 232 ASSERT_TRUE(work_item3->Do());
273 233
274 DWORD read_dword; 234 DWORD read_dword;
275 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(name.c_str(), &read_dword)); 235 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameDword, &read_dword));
276 EXPECT_EQ(read_dword, dword2); 236 EXPECT_EQ(read_dword, kDword2);
277 237
278 work_item3->Rollback(); 238 work_item3->Rollback();
279 EXPECT_TRUE(key.HasValue(name.c_str())); 239 EXPECT_TRUE(test_key_.HasValue(kNameDword));
280 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(name.c_str(), &read_dword)); 240 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameDword, &read_dword));
281 EXPECT_EQ(read_dword, dword1); 241 EXPECT_EQ(read_dword, kDword1);
282 } 242 }
283 243
284 // Write a value to a non-existing key. This should fail. 244 // Write a value to a non-existing key. This should fail.
285 TEST_F(SetRegValueWorkItemTest, WriteNonExistingKey) { 245 TEST_F(SetRegValueWorkItemTest, WriteNonExistingKey) {
286 RegKey key; 246 std::wstring non_existing(kTestKey);
287 247 non_existing.append(&base::FilePath::kSeparators[0], 1);
288 std::wstring parent_key(kTestRoot); 248 non_existing.append(L"NonExistingKey");
289 parent_key.append(&base::FilePath::kSeparators[0], 1); 249
290 parent_key.append(L"WriteNonExistingKey"); 250 scoped_ptr<SetRegValueWorkItem> work_item(
291 251 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
292 std::wstring name(L"name"); 252 non_existing.c_str(),
293 std::wstring data(kDataStr1); 253 WorkItem::kWow64Default,
294 scoped_ptr<SetRegValueWorkItem> work_item( 254 kNameStr,
295 WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 255 kDataStr1,
296 parent_key,
297 WorkItem::kWow64Default,
298 name,
299 data,
300 false)); 256 false));
301 EXPECT_FALSE(work_item->Do()); 257 EXPECT_FALSE(work_item->Do());
302 258
303 work_item.reset(WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 259 work_item.reset(WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
304 parent_key, 260 non_existing.c_str(),
305 WorkItem::kWow64Default, 261 WorkItem::kWow64Default,
306 name, 262 kNameStr,
307 dword1, 263 kDword1,
308 false)); 264 false));
309 EXPECT_FALSE(work_item->Do()); 265 EXPECT_FALSE(work_item->Do());
310 } 266 }
267
268 // Verifies that |actual_previous_value| is |expected_previous_value| and
269 // returns |desired_new_value| to replace it. Unconditionally increments
270 // |invocation_count| to allow tests to assert correctness of the callee's
271 // behaviour.
272 std::wstring VerifyPreviousValueAndReplace(
273 int* invocation_count,
274 const std::wstring& expected_previous_value,
275 const std::wstring& desired_new_value,
276 const std::wstring& actual_previous_value) {
277 ++(*invocation_count);
278 EXPECT_EQ(expected_previous_value, actual_previous_value);
279 return desired_new_value;
280 }
281
282 // Modify an existing value with the callback API.
283 TEST_F(SetRegValueWorkItemTest, ModifyExistingWithCallback) {
284 // Write |kDataStr1| to the value we are going to modify.
285 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameStr, kDataStr1));
286
287 int callback_invocation_count = 0;
288
289 scoped_ptr<SetRegValueWorkItem> work_item(
290 WorkItem::CreateSetRegValueWorkItem(
291 HKEY_CURRENT_USER,
292 kTestKey,
293 WorkItem::kWow64Default,
294 kNameStr,
295 base::Bind(&VerifyPreviousValueAndReplace, &callback_invocation_count,
296 kDataStr1, kDataStr2)));
297
298 // The callback should not be used until the item is executed.
299 EXPECT_EQ(0, callback_invocation_count);
300
301 ASSERT_TRUE(work_item->Do());
302
303 std::wstring read_out;
304 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
305 EXPECT_EQ(read_out, kDataStr2);
306
307 // The callback should have been used only once to achieve this result.
308 EXPECT_EQ(1, callback_invocation_count);
309
310 work_item->Rollback();
311
312 EXPECT_TRUE(test_key_.HasValue(kNameStr));
313 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
314 EXPECT_EQ(read_out, kDataStr1);
315
316 // The callback should not have been used again for the rollback.
317 EXPECT_EQ(1, callback_invocation_count);
318 }
319
320 // Modify a non-existing value with the callback API.
321 TEST_F(SetRegValueWorkItemTest, ModifyNonExistingWithCallback) {
322 int callback_invocation_count = 0;
323
324 scoped_ptr<SetRegValueWorkItem> work_item(
325 WorkItem::CreateSetRegValueWorkItem(
326 HKEY_CURRENT_USER,
327 kTestKey,
328 WorkItem::kWow64Default,
329 kNameStr,
330 base::Bind(&VerifyPreviousValueAndReplace, &callback_invocation_count,
331 L"", kDataStr1)));
332
333 EXPECT_EQ(0, callback_invocation_count);
334
335 ASSERT_TRUE(work_item->Do());
336
337 std::wstring read_out;
338 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out));
339 EXPECT_EQ(read_out, kDataStr1);
340
341 EXPECT_EQ(1, callback_invocation_count);
342
343 work_item->Rollback();
344
345 EXPECT_FALSE(test_key_.HasValue(kNameStr));
346
347 EXPECT_EQ(1, callback_invocation_count);
348 }
349
350 // Modify an existing value which is not a string (REG_SZ) with the string
351 // callback API.
352 TEST_F(SetRegValueWorkItemTest, ModifyExistingNonStringWithStringCallback) {
353 // Write |kDword1| to the value we are going to modify.
354 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameStr, kDword1));
355
356 int callback_invocation_count = 0;
357
358 scoped_ptr<SetRegValueWorkItem> work_item(
359 WorkItem::CreateSetRegValueWorkItem(
360 HKEY_CURRENT_USER,
361 kTestKey,
362 WorkItem::kWow64Default,
363 kNameStr,
364 base::Bind(&VerifyPreviousValueAndReplace, &callback_invocation_count,
365 L"", kDataStr1)));
366
367 EXPECT_EQ(0, callback_invocation_count);
368
369 ASSERT_TRUE(work_item->Do());
370
371 std::wstring read_str_out;
372 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_str_out));
373 EXPECT_EQ(read_str_out, kDataStr1);
374
375 EXPECT_EQ(1, callback_invocation_count);
376
377 work_item->Rollback();
378
379 DWORD read_dword_out = 0;
380 EXPECT_TRUE(test_key_.HasValue(kNameStr));
381 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameStr, &read_dword_out));
382 EXPECT_EQ(read_dword_out, kDword1);
383
384 EXPECT_EQ(1, callback_invocation_count);
385 }
OLDNEW
« no previous file with comments | « chrome/installer/util/set_reg_value_work_item.cc ('k') | chrome/installer/util/work_item.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698