| 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. |
| 270 std::wstring VerifyPreviousValueAndReplace( |
| 271 const std::wstring& expected_previous_value, |
| 272 const std::wstring& desired_new_value, |
| 273 const std::wstring& actual_previous_value) { |
| 274 EXPECT_EQ(expected_previous_value, actual_previous_value); |
| 275 return desired_new_value; |
| 276 } |
| 277 |
| 278 // Modify an existing value with the callback API. |
| 279 TEST_F(SetRegValueWorkItemTest, ModifyExistingWithCallback) { |
| 280 // Write |kDataStr1| to the value we are going to modify. |
| 281 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameStr, kDataStr1)); |
| 282 |
| 283 scoped_ptr<SetRegValueWorkItem> work_item( |
| 284 WorkItem::CreateSetRegValueWorkItem( |
| 285 HKEY_CURRENT_USER, |
| 286 kTestKey, |
| 287 WorkItem::kWow64Default, |
| 288 kNameStr, |
| 289 base::Bind(&VerifyPreviousValueAndReplace, kDataStr1, kDataStr2))); |
| 290 |
| 291 ASSERT_TRUE(work_item->Do()); |
| 292 |
| 293 std::wstring read_out; |
| 294 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out)); |
| 295 EXPECT_EQ(read_out, kDataStr2); |
| 296 |
| 297 work_item->Rollback(); |
| 298 |
| 299 EXPECT_TRUE(test_key_.HasValue(kNameStr)); |
| 300 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out)); |
| 301 EXPECT_EQ(read_out, kDataStr1); |
| 302 } |
| 303 |
| 304 // Modify a non-existing value with the callback API. |
| 305 TEST_F(SetRegValueWorkItemTest, ModifyNonExistingWithCallback) { |
| 306 scoped_ptr<SetRegValueWorkItem> work_item( |
| 307 WorkItem::CreateSetRegValueWorkItem( |
| 308 HKEY_CURRENT_USER, |
| 309 kTestKey, |
| 310 WorkItem::kWow64Default, |
| 311 kNameStr, |
| 312 base::Bind(&VerifyPreviousValueAndReplace, L"", kDataStr1))); |
| 313 |
| 314 ASSERT_TRUE(work_item->Do()); |
| 315 |
| 316 std::wstring read_out; |
| 317 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_out)); |
| 318 EXPECT_EQ(read_out, kDataStr1); |
| 319 |
| 320 work_item->Rollback(); |
| 321 |
| 322 EXPECT_FALSE(test_key_.HasValue(kNameStr)); |
| 323 } |
| 324 |
| 325 // Modify an existing value which is not a string (REG_SZ) with the string |
| 326 // callback API. |
| 327 TEST_F(SetRegValueWorkItemTest, ModifyExistingNonStringWithStringCallback) { |
| 328 // Write |kDword1| to the value we are going to modify. |
| 329 ASSERT_EQ(ERROR_SUCCESS, test_key_.WriteValue(kNameStr, kDword1)); |
| 330 |
| 331 scoped_ptr<SetRegValueWorkItem> work_item( |
| 332 WorkItem::CreateSetRegValueWorkItem( |
| 333 HKEY_CURRENT_USER, |
| 334 kTestKey, |
| 335 WorkItem::kWow64Default, |
| 336 kNameStr, |
| 337 base::Bind(&VerifyPreviousValueAndReplace, L"", kDataStr1))); |
| 338 |
| 339 ASSERT_TRUE(work_item->Do()); |
| 340 |
| 341 std::wstring read_str_out; |
| 342 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValue(kNameStr, &read_str_out)); |
| 343 EXPECT_EQ(read_str_out, kDataStr1); |
| 344 |
| 345 work_item->Rollback(); |
| 346 |
| 347 DWORD read_dword_out = 0; |
| 348 EXPECT_TRUE(test_key_.HasValue(kNameStr)); |
| 349 EXPECT_EQ(ERROR_SUCCESS, test_key_.ReadValueDW(kNameStr, &read_dword_out)); |
| 350 EXPECT_EQ(read_dword_out, kDword1); |
| 351 } |
| OLD | NEW |