Chromium Code Reviews| Index: base/win/registry_unittest.cc |
| diff --git a/base/win/registry_unittest.cc b/base/win/registry_unittest.cc |
| index 155402a351fc4593d57f6f8a479c09969d041400..b0d0e7f7a629d8ff9f811cbd372f4dd87676201f 100644 |
| --- a/base/win/registry_unittest.cc |
| +++ b/base/win/registry_unittest.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/compiler_specific.h" |
| #include "base/stl_util.h" |
| +#include "base/win/windows_version.h" |
|
grt (UTC plus 2)
2014/05/16 15:44:43
unused
Will Harris
2014/05/16 22:55:45
used for OSInfo below
|
| #include "testing/gtest/include/gtest/gtest.h" |
| namespace base { |
| @@ -35,6 +36,16 @@ class RegistryTest : public testing::Test { |
| // Clean up the temporary key. |
| RegKey key(HKEY_CURRENT_USER, L"", KEY_SET_VALUE); |
| ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_READ)); |
| + |
| + // Delete all variations of the Software key we created. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_32KEY)); |
|
grt (UTC plus 2)
2014/05/16 15:44:43
indentation. please try "git cl format". it wraps
Will Harris
2014/05/16 22:55:45
Done.
|
| + key.DeleteKey(kRootKey); |
| + |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_64KEY)); |
| + key.DeleteKey(kRootKey); |
| } |
| private: |
| @@ -158,6 +169,150 @@ TEST_F(RegistryTest, TruncatedCharTest) { |
| EXPECT_FALSE(iterator.Valid()); |
| } |
| +TEST_F(RegistryTest, RecursiveDelete) { |
|
grt (UTC plus 2)
2014/05/16 15:44:43
DeleteKey was untested before?!??!?
Will Harris
2014/05/16 22:55:45
Yes - scary. I tested the old SHDeleteKey code wi
|
| + RegKey key; |
| + // Create kRootKey->Foo |
| + // \->Bar |
| + // \->Foo |
| + // \->Moo |
| + // \->Foo |
| + // and delete kRootKey->Foo |
| + std::wstring foo_key(kRootKey); |
| + foo_key += L"\\Foo"; |
| + ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(), |
| + KEY_WRITE)); |
| + foo_key += L"\\Bar"; |
| + |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Bar", KEY_WRITE)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Moo", KEY_WRITE)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Foo", KEY_WRITE)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(), |
| + KEY_WRITE)); |
| + foo_key += L"\\Foo"; |
| + ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Foo", KEY_WRITE)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(), |
| + KEY_READ)); |
| + |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_WRITE)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(L"Bar")); |
| + ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L"Foo")); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(L"Foo")); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(), |
| + KEY_READ)); |
| +} |
| + |
| +// This test requires running as an Administrator as it tests redirected |
| +// registry writes to HKLM\Software |
|
grt (UTC plus 2)
2014/05/16 15:44:43
can the Administrator requirement be removed by ma
Will Harris
2014/05/16 22:55:45
HKLM\Software is the only key that is universally
|
| +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa384253.aspx |
| +TEST_F(RegistryTest, Wow64) { |
| + RegKey key; |
| + std::wstring foo_key(L"Software\\"); |
| + foo_key += kRootKey; |
| + foo_key += L"\\Foo"; |
| + std::wstring foo_wow64_key(L"Software\\Wow6432Node\\"); |
| + foo_wow64_key += kRootKey; |
| + foo_wow64_key += L"\\Foo"; |
| + |
| +#if defined(_WIN64) |
| + // Test 32-bit key access from 64-bit. |
|
grt (UTC plus 2)
2014/05/16 15:44:43
it looks like a lot of the _WIN64 part and the non
Will Harris
2014/05/16 22:55:45
I went ahead and split this test up a bit.
|
| + ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_WRITE | KEY_WOW64_32KEY)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ | KEY_WOW64_64KEY)); |
| + |
| + // Open the 64-bit view of the parent and try to delete the test key. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_64KEY)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_32KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + |
| + // Test 64-bit key access from 64-bit. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_WRITE | KEY_WOW64_64KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ | KEY_WOW64_32KEY)); |
| + |
| + // Open the 32-bit view of the parent and try to delete the test key. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_32KEY)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_64KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| +#else |
| + OSInfo* os_info = OSInfo::GetInstance(); |
| + |
| + if (os_info->wow64_status() == OSInfo::WOW64_ENABLED) { |
| + // Test 64-bit key access from 32-bit. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_WRITE | KEY_WOW64_64KEY)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ | KEY_WOW64_32KEY)); |
| + |
| + // Open the 32-bit view of the parent and try to delete the test key. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_32KEY)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_64KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + |
| + // Test 32-bit key access from 32-bit. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_WRITE | KEY_WOW64_32KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ | KEY_WOW64_64KEY)); |
| + |
| + // Test accessing the 32-bit values via Wow6432Node. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, |
| + foo_wow64_key.c_str(), KEY_READ)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, |
| + foo_wow64_key.c_str(), KEY_READ | KEY_WOW64_64KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, |
| + foo_wow64_key.c_str(), KEY_READ | KEY_WOW64_32KEY)); |
| + |
| + // Open the 64-bit view of the parent and try to delete the test key. |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_64KEY)); |
| + ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE | KEY_WOW64_32KEY)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + } else { |
| + ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_LOCAL_MACHINE, foo_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, foo_wow64_key.c_str(), |
| + KEY_READ)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_LOCAL_MACHINE, L"Software", |
| + KEY_SET_VALUE)); |
| + ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey)); |
| + } |
| +#endif // _WIN64 |
| +} |
| + |
| + |
| } // namespace |
| } // namespace win |