| Index: base/win/registry_unittest.cc
|
| diff --git a/base/win/registry_unittest.cc b/base/win/registry_unittest.cc
|
| deleted file mode 100644
|
| index 22576634f9a4aaa6e3906bea3130f98dd89924e8..0000000000000000000000000000000000000000
|
| --- a/base/win/registry_unittest.cc
|
| +++ /dev/null
|
| @@ -1,420 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/win/registry.h"
|
| -
|
| -#include <cstring>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/win/windows_version.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace base {
|
| -namespace win {
|
| -
|
| -namespace {
|
| -
|
| -class RegistryTest : public testing::Test {
|
| - protected:
|
| -#if defined(_WIN64)
|
| - static const REGSAM kNativeViewMask = KEY_WOW64_64KEY;
|
| - static const REGSAM kRedirectedViewMask = KEY_WOW64_32KEY;
|
| -#else
|
| - static const REGSAM kNativeViewMask = KEY_WOW64_32KEY;
|
| - static const REGSAM kRedirectedViewMask = KEY_WOW64_64KEY;
|
| -#endif // _WIN64
|
| -
|
| - RegistryTest() {}
|
| - void SetUp() override {
|
| - // Create a temporary key.
|
| - RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS);
|
| - key.DeleteKey(kRootKey);
|
| - ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_READ));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, kRootKey, KEY_READ));
|
| - foo_software_key_ = L"Software\\";
|
| - foo_software_key_ += kRootKey;
|
| - foo_software_key_ += L"\\Foo";
|
| - }
|
| -
|
| - void TearDown() override {
|
| - // 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));
|
| - }
|
| -
|
| - static bool IsRedirectorPresent() {
|
| -#if defined(_WIN64)
|
| - return true;
|
| -#else
|
| - return OSInfo::GetInstance()->wow64_status() == OSInfo::WOW64_ENABLED;
|
| -#endif
|
| - }
|
| -
|
| - const wchar_t* const kRootKey = L"Base_Registry_Unittest";
|
| - std::wstring foo_software_key_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(RegistryTest);
|
| -};
|
| -
|
| -// static
|
| -const REGSAM RegistryTest::kNativeViewMask;
|
| -const REGSAM RegistryTest::kRedirectedViewMask;
|
| -
|
| -TEST_F(RegistryTest, ValueTest) {
|
| - RegKey key;
|
| -
|
| - std::wstring foo_key(kRootKey);
|
| - foo_key += L"\\Foo";
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ));
|
| -
|
| - {
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ | KEY_SET_VALUE));
|
| - ASSERT_TRUE(key.Valid());
|
| -
|
| - const wchar_t kStringValueName[] = L"StringValue";
|
| - const wchar_t kDWORDValueName[] = L"DWORDValue";
|
| - const wchar_t kInt64ValueName[] = L"Int64Value";
|
| - const wchar_t kStringData[] = L"string data";
|
| - const DWORD kDWORDData = 0xdeadbabe;
|
| - const int64 kInt64Data = 0xdeadbabedeadbabeLL;
|
| -
|
| - // Test value creation
|
| - ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kStringValueName, kStringData));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kDWORDValueName, kDWORDData));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kInt64ValueName, &kInt64Data,
|
| - sizeof(kInt64Data), REG_QWORD));
|
| - EXPECT_EQ(3U, key.GetValueCount());
|
| - EXPECT_TRUE(key.HasValue(kStringValueName));
|
| - EXPECT_TRUE(key.HasValue(kDWORDValueName));
|
| - EXPECT_TRUE(key.HasValue(kInt64ValueName));
|
| -
|
| - // Test Read
|
| - std::wstring string_value;
|
| - DWORD dword_value = 0;
|
| - int64 int64_value = 0;
|
| - ASSERT_EQ(ERROR_SUCCESS, key.ReadValue(kStringValueName, &string_value));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.ReadValueDW(kDWORDValueName, &dword_value));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.ReadInt64(kInt64ValueName, &int64_value));
|
| - EXPECT_STREQ(kStringData, string_value.c_str());
|
| - EXPECT_EQ(kDWORDData, dword_value);
|
| - EXPECT_EQ(kInt64Data, int64_value);
|
| -
|
| - // Make sure out args are not touched if ReadValue fails
|
| - const wchar_t* kNonExistent = L"NonExistent";
|
| - ASSERT_NE(ERROR_SUCCESS, key.ReadValue(kNonExistent, &string_value));
|
| - ASSERT_NE(ERROR_SUCCESS, key.ReadValueDW(kNonExistent, &dword_value));
|
| - ASSERT_NE(ERROR_SUCCESS, key.ReadInt64(kNonExistent, &int64_value));
|
| - EXPECT_STREQ(kStringData, string_value.c_str());
|
| - EXPECT_EQ(kDWORDData, dword_value);
|
| - EXPECT_EQ(kInt64Data, int64_value);
|
| -
|
| - // Test delete
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteValue(kStringValueName));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteValue(kDWORDValueName));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteValue(kInt64ValueName));
|
| - EXPECT_EQ(0U, key.GetValueCount());
|
| - EXPECT_FALSE(key.HasValue(kStringValueName));
|
| - EXPECT_FALSE(key.HasValue(kDWORDValueName));
|
| - EXPECT_FALSE(key.HasValue(kInt64ValueName));
|
| - }
|
| -}
|
| -
|
| -TEST_F(RegistryTest, BigValueIteratorTest) {
|
| - RegKey key;
|
| - std::wstring foo_key(kRootKey);
|
| - foo_key += L"\\Foo";
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ | KEY_SET_VALUE));
|
| - ASSERT_TRUE(key.Valid());
|
| -
|
| - // Create a test value that is larger than MAX_PATH.
|
| - std::wstring data(MAX_PATH * 2, L'a');
|
| -
|
| - ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(data.c_str(), data.c_str()));
|
| -
|
| - RegistryValueIterator iterator(HKEY_CURRENT_USER, foo_key.c_str());
|
| - ASSERT_TRUE(iterator.Valid());
|
| - EXPECT_STREQ(data.c_str(), iterator.Name());
|
| - EXPECT_STREQ(data.c_str(), iterator.Value());
|
| - // ValueSize() is in bytes, including NUL.
|
| - EXPECT_EQ((MAX_PATH * 2 + 1) * sizeof(wchar_t), iterator.ValueSize());
|
| - ++iterator;
|
| - EXPECT_FALSE(iterator.Valid());
|
| -}
|
| -
|
| -TEST_F(RegistryTest, TruncatedCharTest) {
|
| - RegKey key;
|
| - std::wstring foo_key(kRootKey);
|
| - foo_key += L"\\Foo";
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ | KEY_SET_VALUE));
|
| - ASSERT_TRUE(key.Valid());
|
| -
|
| - const wchar_t kName[] = L"name";
|
| - // kData size is not a multiple of sizeof(wchar_t).
|
| - const uint8 kData[] = { 1, 2, 3, 4, 5 };
|
| - EXPECT_EQ(5, arraysize(kData));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kName, kData,
|
| - arraysize(kData), REG_BINARY));
|
| -
|
| - RegistryValueIterator iterator(HKEY_CURRENT_USER, foo_key.c_str());
|
| - ASSERT_TRUE(iterator.Valid());
|
| - EXPECT_STREQ(kName, iterator.Name());
|
| - // ValueSize() is in bytes.
|
| - ASSERT_EQ(arraysize(kData), iterator.ValueSize());
|
| - // Value() is NUL terminated.
|
| - int end = (iterator.ValueSize() + sizeof(wchar_t) - 1) / sizeof(wchar_t);
|
| - EXPECT_NE(L'\0', iterator.Value()[end-1]);
|
| - EXPECT_EQ(L'\0', iterator.Value()[end]);
|
| - EXPECT_EQ(0, std::memcmp(kData, iterator.Value(), arraysize(kData)));
|
| - ++iterator;
|
| - EXPECT_FALSE(iterator.Valid());
|
| -}
|
| -
|
| -TEST_F(RegistryTest, RecursiveDelete) {
|
| - RegKey key;
|
| - // Create kRootKey->Foo
|
| - // \->Bar (TestValue)
|
| - // \->Foo (TestValue)
|
| - // \->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));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Bar", KEY_WRITE));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(L"TestValue", L"TestData"));
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Create(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Moo", KEY_WRITE));
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Create(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Foo", KEY_WRITE));
|
| - foo_key += L"\\Bar";
|
| - 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.WriteValue(L"TestValue", L"TestData"));
|
| - 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_NE(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo"));
|
| - ASSERT_NE(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo\\Bar\\Foo"));
|
| - ASSERT_NE(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo\\Bar"));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo\\Foo"));
|
| -
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Bar", 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));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L""));
|
| - ASSERT_NE(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_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
|
| -// http://msdn.microsoft.com/en-us/library/windows/desktop/aa384253.aspx
|
| -// TODO(wfh): flaky test on Vista. See http://crbug.com/377917
|
| -TEST_F(RegistryTest, DISABLED_Wow64RedirectedFromNative) {
|
| - if (!IsRedirectorPresent())
|
| - return;
|
| -
|
| - RegKey key;
|
| -
|
| - // Test redirected key access from non-redirected.
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Create(HKEY_LOCAL_MACHINE,
|
| - foo_software_key_.c_str(),
|
| - KEY_WRITE | kRedirectedViewMask));
|
| - ASSERT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE, foo_software_key_.c_str(), KEY_READ));
|
| - ASSERT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE,
|
| - foo_software_key_.c_str(),
|
| - KEY_READ | kNativeViewMask));
|
| -
|
| - // Open the non-redirected 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 | kNativeViewMask));
|
| - ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey));
|
| -
|
| - // Open the redirected view and delete the key created above.
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE,
|
| - L"Software",
|
| - KEY_SET_VALUE | kRedirectedViewMask));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey));
|
| -}
|
| -
|
| -// Test for the issue found in http://crbug.com/384587 where OpenKey would call
|
| -// Close() and reset wow64_access_ flag to 0 and cause a NOTREACHED to hit on a
|
| -// subsequent OpenKey call.
|
| -TEST_F(RegistryTest, SameWowFlags) {
|
| - RegKey key;
|
| -
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE,
|
| - L"Software",
|
| - KEY_READ | KEY_WOW64_64KEY));
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.OpenKey(L"Microsoft",
|
| - KEY_READ | KEY_WOW64_64KEY));
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.OpenKey(L"Windows",
|
| - KEY_READ | KEY_WOW64_64KEY));
|
| -}
|
| -
|
| -// TODO(wfh): flaky test on Vista. See http://crbug.com/377917
|
| -TEST_F(RegistryTest, DISABLED_Wow64NativeFromRedirected) {
|
| - if (!IsRedirectorPresent())
|
| - return;
|
| - RegKey key;
|
| -
|
| - // Test non-redirected key access from redirected.
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Create(HKEY_LOCAL_MACHINE,
|
| - foo_software_key_.c_str(),
|
| - KEY_WRITE | kNativeViewMask));
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE, foo_software_key_.c_str(), KEY_READ));
|
| - ASSERT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE,
|
| - foo_software_key_.c_str(),
|
| - KEY_READ | kRedirectedViewMask));
|
| -
|
| - // Open the redirected view of the parent and try to delete the test key
|
| - // from the non-redirected view.
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE,
|
| - L"Software",
|
| - KEY_SET_VALUE | kRedirectedViewMask));
|
| - ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey));
|
| -
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_LOCAL_MACHINE,
|
| - L"Software",
|
| - KEY_SET_VALUE | kNativeViewMask));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey));
|
| -}
|
| -
|
| -TEST_F(RegistryTest, OpenSubKey) {
|
| - RegKey key;
|
| - ASSERT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER,
|
| - kRootKey,
|
| - KEY_READ | KEY_CREATE_SUB_KEY));
|
| -
|
| - ASSERT_NE(ERROR_SUCCESS, key.OpenKey(L"foo", KEY_READ));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"foo", KEY_READ));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_READ));
|
| - ASSERT_EQ(ERROR_SUCCESS, key.OpenKey(L"foo", KEY_READ));
|
| -
|
| - std::wstring foo_key(kRootKey);
|
| - foo_key += L"\\Foo";
|
| - 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_EQ(ERROR_SUCCESS, key.DeleteKey(L"foo"));
|
| -}
|
| -
|
| -class TestChangeDelegate {
|
| - public:
|
| - TestChangeDelegate() : called_(false) {}
|
| - ~TestChangeDelegate() {}
|
| -
|
| - void OnKeyChanged() {
|
| - MessageLoop::current()->QuitWhenIdle();
|
| - called_ = true;
|
| - }
|
| -
|
| - bool WasCalled() {
|
| - bool was_called = called_;
|
| - called_ = false;
|
| - return was_called;
|
| - }
|
| -
|
| - private:
|
| - bool called_;
|
| -};
|
| -
|
| -TEST_F(RegistryTest, ChangeCallback) {
|
| - RegKey key;
|
| - TestChangeDelegate delegate;
|
| - MessageLoop message_loop;
|
| -
|
| - std::wstring foo_key(kRootKey);
|
| - foo_key += L"\\Foo";
|
| - ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ));
|
| -
|
| - ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
|
| - Unretained(&delegate))));
|
| - EXPECT_FALSE(delegate.WasCalled());
|
| -
|
| - // Make some change.
|
| - RegKey key2;
|
| - ASSERT_EQ(ERROR_SUCCESS, key2.Open(HKEY_CURRENT_USER, foo_key.c_str(),
|
| - KEY_READ | KEY_SET_VALUE));
|
| - ASSERT_TRUE(key2.Valid());
|
| - EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name", L"data"));
|
| -
|
| - // Allow delivery of the notification.
|
| - EXPECT_FALSE(delegate.WasCalled());
|
| - base::RunLoop().Run();
|
| -
|
| - ASSERT_TRUE(delegate.WasCalled());
|
| - EXPECT_FALSE(delegate.WasCalled());
|
| -
|
| - ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
|
| - Unretained(&delegate))));
|
| -
|
| - // Change something else.
|
| - EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name2", L"data2"));
|
| - base::RunLoop().Run();
|
| - ASSERT_TRUE(delegate.WasCalled());
|
| -
|
| - ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
|
| - Unretained(&delegate))));
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(delegate.WasCalled());
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -} // namespace win
|
| -} // namespace base
|
|
|