OLD | NEW |
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 } |
OLD | NEW |