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

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

Issue 8176008: Merge 101684 - Added CopyRegKeyWorkItem in support of IE low rights policy fixes. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/835/src/
Patch Set: Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include <atlsecurity.h> // NOLINT 6 #include <atlsecurity.h> // NOLINT
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/win/registry.h" 9 #include "base/win/registry.h"
10 #include "chrome/installer/util/delete_reg_key_work_item.h" 10 #include "chrome/installer/util/delete_reg_key_work_item.h"
11 #include "chrome/installer/util/registry_test_data.h"
11 #include "chrome/installer/util/work_item.h" 12 #include "chrome/installer/util/work_item.h"
12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
13 14
14 using base::win::RegKey; 15 using base::win::RegKey;
15 16
16 namespace {
17 wchar_t test_root[] = L"SOFTWARE\\TmpTmp";
18 }
19
20 class DeleteRegKeyWorkItemTest : public testing::Test { 17 class DeleteRegKeyWorkItemTest : public testing::Test {
21 protected: 18 protected:
22 virtual void SetUp() { 19 static void TearDownTestCase() {
23 // Create a temporary key for testing 20 logging::CloseLogFile();
24 RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS);
25 key.DeleteKey(test_root);
26 ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, test_root, KEY_READ));
27 ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, test_root,
28 KEY_READ));
29 } 21 }
30 22
31 virtual void TearDown() { 23 virtual void SetUp() {
32 logging::CloseLogFile(); 24 ASSERT_TRUE(test_data_.Initialize(HKEY_CURRENT_USER, L"SOFTWARE\\TmpTmp"));
33 // Clean up the temporary key
34 RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS);
35 ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(test_root));
36 } 25 }
26
27 RegistryTestData test_data_;
37 }; 28 };
38 29
39 // Test that deleting a key that doesn't exist succeeds, and that rollback does 30 // Test that deleting a key that doesn't exist succeeds, and that rollback does
40 // nothing. 31 // nothing.
41 TEST_F(DeleteRegKeyWorkItemTest, TestNoKey) { 32 TEST_F(DeleteRegKeyWorkItemTest, TestNoKey) {
33 const std::wstring key_paths[] = {
34 std::wstring(test_data_.base_path() + L"\\NoKeyHere"),
35 std::wstring(test_data_.base_path() + L"\\NoKeyHere\\OrHere")
36 };
42 RegKey key; 37 RegKey key;
43 std::wstring key_name(std::wstring(test_root) + L"\\NoKeyHere"); 38 for (size_t i = 0; i < arraysize(key_paths); ++i) {
44 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 39 const std::wstring& key_path = key_paths[i];
45 KEY_READ)); 40 scoped_ptr<DeleteRegKeyWorkItem> item(
46 scoped_ptr<DeleteRegKeyWorkItem> item( 41 WorkItem::CreateDeleteRegKeyWorkItem(test_data_.root_key(), key_path));
47 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name)); 42 EXPECT_TRUE(item->Do());
48 EXPECT_TRUE(item->Do()); 43 EXPECT_NE(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_path.c_str(),
49 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 44 KEY_READ));
50 KEY_READ)); 45 item->Rollback();
51 item->Rollback(); 46 item.reset();
52 item.reset(); 47 EXPECT_NE(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_path.c_str(),
53 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 48 KEY_READ));
54 KEY_READ)); 49 }
55 }
56
57 // Test that deleting a subkey of a key that doesn't exist succeeds, and that
58 // rollback does nothing.
59 TEST_F(DeleteRegKeyWorkItemTest, TestNoSubkey) {
60 RegKey key;
61 std::wstring key_name(std::wstring(test_root) + L"\\NoKeyHere\\OrHere");
62 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
63 KEY_READ));
64 scoped_ptr<DeleteRegKeyWorkItem> item(
65 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name));
66 EXPECT_TRUE(item->Do());
67 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
68 KEY_READ));
69 item->Rollback();
70 item.reset();
71 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
72 KEY_READ));
73 } 50 }
74 51
75 // Test that deleting an empty key succeeds, and that rollback brings it back. 52 // Test that deleting an empty key succeeds, and that rollback brings it back.
76 TEST_F(DeleteRegKeyWorkItemTest, TestEmptyKey) { 53 TEST_F(DeleteRegKeyWorkItemTest, TestEmptyKey) {
77 RegKey key; 54 RegKey key;
78 std::wstring key_name(std::wstring(test_root) + L"\\EmptyKey"); 55 const std::wstring& key_path = test_data_.empty_key_path();
79 EXPECT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, key_name.c_str(),
80 KEY_WRITE));
81 key.Close();
82 scoped_ptr<DeleteRegKeyWorkItem> item( 56 scoped_ptr<DeleteRegKeyWorkItem> item(
83 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name)); 57 WorkItem::CreateDeleteRegKeyWorkItem(test_data_.root_key(), key_path));
84 EXPECT_TRUE(item->Do()); 58 EXPECT_TRUE(item->Do());
85 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 59 EXPECT_NE(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_path.c_str(),
86 KEY_READ)); 60 KEY_READ));
87 item->Rollback(); 61 item->Rollback();
88 item.reset(); 62 item.reset();
89 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 63 EXPECT_EQ(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_path.c_str(),
90 KEY_READ)); 64 KEY_READ));
91 } 65 }
92 66
93 // Test that deleting a key with subkeys and values succeeds, and that rollback 67 // Test that deleting a key with subkeys and values succeeds, and that rollback
94 // brings them all back. 68 // brings them all back.
95 TEST_F(DeleteRegKeyWorkItemTest, TestNonEmptyKey) { 69 TEST_F(DeleteRegKeyWorkItemTest, TestNonEmptyKey) {
96 RegKey key; 70 RegKey key;
97 std::wstring key_name(std::wstring(test_root) + L"\\NonEmptyKey"); 71 const std::wstring& key_path = test_data_.non_empty_key_path();
98 EXPECT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, key_name.c_str(),
99 KEY_WRITE));
100 EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(NULL, key_name.c_str()));
101 EXPECT_EQ(ERROR_SUCCESS, key.CreateKey(L"Subkey", KEY_WRITE));
102 EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(L"SomeValue", 1U));
103 key.Close();
104 scoped_ptr<DeleteRegKeyWorkItem> item( 72 scoped_ptr<DeleteRegKeyWorkItem> item(
105 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name)); 73 WorkItem::CreateDeleteRegKeyWorkItem(test_data_.root_key(), key_path));
106 EXPECT_TRUE(item->Do()); 74 EXPECT_TRUE(item->Do());
107 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 75 EXPECT_NE(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_path.c_str(),
108 KEY_READ)); 76 KEY_READ));
109 item->Rollback(); 77 item->Rollback();
110 item.reset(); 78 item.reset();
111 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 79 test_data_.ExpectMatchesNonEmptyKey(test_data_.root_key(), key_path.c_str());
112 KEY_READ));
113 std::wstring str_value;
114 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(NULL, &str_value));
115 EXPECT_EQ(key_name, str_value);
116 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey", KEY_READ));
117 DWORD dw_value = 0;
118 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"SomeValue", &dw_value));
119 EXPECT_EQ(1U, dw_value);
120 } 80 }
121 81
122 // Test that deleting a key with subkeys we can't delete fails, and that 82 // Test that deleting a key with subkeys we can't delete fails, and that
123 // everything is there after rollback. 83 // everything is there after rollback.
124 // Showing as flaky on windows. 84 // Showing as flaky on windows.
125 // http://crbug.com/74654 85 // http://crbug.com/74654
126 TEST_F(DeleteRegKeyWorkItemTest, DISABLED_TestUndeletableKey) { 86 TEST_F(DeleteRegKeyWorkItemTest, DISABLED_TestUndeletableKey) {
127 RegKey key; 87 RegKey key;
128 std::wstring key_name(std::wstring(test_root) + L"\\UndeletableKey"); 88 std::wstring key_name(test_data_.base_path() + L"\\UndeletableKey");
129 EXPECT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, key_name.c_str(), 89 EXPECT_EQ(ERROR_SUCCESS, key.Create(test_data_.root_key(), key_name.c_str(),
130 KEY_WRITE)); 90 KEY_WRITE));
131 EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(NULL, key_name.c_str())); 91 EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(NULL, key_name.c_str()));
132 DWORD dw_value = 1; 92 DWORD dw_value = 1;
133 RegKey subkey; 93 RegKey subkey;
134 RegKey subkey2; 94 RegKey subkey2;
135 EXPECT_EQ(ERROR_SUCCESS, subkey.Create(key.Handle(), L"Subkey", 95 EXPECT_EQ(ERROR_SUCCESS, subkey.Create(key.Handle(), L"Subkey",
136 KEY_WRITE | WRITE_DAC)); 96 KEY_WRITE | WRITE_DAC));
137 EXPECT_EQ(ERROR_SUCCESS, subkey.WriteValue(L"SomeValue", 1U)); 97 EXPECT_EQ(ERROR_SUCCESS, subkey.WriteValue(L"SomeValue", 1U));
138 EXPECT_EQ(ERROR_SUCCESS, subkey2.Create(subkey.Handle(), L"Subkey2", 98 EXPECT_EQ(ERROR_SUCCESS, subkey2.Create(subkey.Handle(), L"Subkey2",
139 KEY_WRITE | WRITE_DAC)); 99 KEY_WRITE | WRITE_DAC));
140 EXPECT_EQ(ERROR_SUCCESS, subkey2.WriteValue(L"", 2U)); 100 EXPECT_EQ(ERROR_SUCCESS, subkey2.WriteValue(L"", 2U));
141 CSecurityDesc sec_desc; 101 CSecurityDesc sec_desc;
142 sec_desc.FromString(L"D:PAI(A;OICI;KR;;;BU)"); // builtin users read 102 sec_desc.FromString(L"D:PAI(A;OICI;KR;;;BU)"); // builtin users read
143 EXPECT_EQ(ERROR_SUCCESS, 103 EXPECT_EQ(ERROR_SUCCESS,
144 RegSetKeySecurity(subkey.Handle(), DACL_SECURITY_INFORMATION, 104 RegSetKeySecurity(subkey.Handle(), DACL_SECURITY_INFORMATION,
145 const_cast<SECURITY_DESCRIPTOR*>( 105 const_cast<SECURITY_DESCRIPTOR*>(
146 sec_desc.GetPSECURITY_DESCRIPTOR()))); 106 sec_desc.GetPSECURITY_DESCRIPTOR())));
147 sec_desc.FromString(L"D:PAI(A;OICI;KA;;;BU)"); // builtin users all access 107 sec_desc.FromString(L"D:PAI(A;OICI;KA;;;BU)"); // builtin users all access
148 EXPECT_EQ(ERROR_SUCCESS, 108 EXPECT_EQ(ERROR_SUCCESS,
149 RegSetKeySecurity(subkey2.Handle(), DACL_SECURITY_INFORMATION, 109 RegSetKeySecurity(subkey2.Handle(), DACL_SECURITY_INFORMATION,
150 const_cast<SECURITY_DESCRIPTOR*>( 110 const_cast<SECURITY_DESCRIPTOR*>(
151 sec_desc.GetPSECURITY_DESCRIPTOR()))); 111 sec_desc.GetPSECURITY_DESCRIPTOR())));
152 subkey2.Close(); 112 subkey2.Close();
153 subkey.Close(); 113 subkey.Close();
154 key.Close(); 114 key.Close();
155 scoped_ptr<DeleteRegKeyWorkItem> item( 115 scoped_ptr<DeleteRegKeyWorkItem> item(
156 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name)); 116 WorkItem::CreateDeleteRegKeyWorkItem(test_data_.root_key(), key_name));
157 EXPECT_FALSE(item->Do()); 117 EXPECT_FALSE(item->Do());
158 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 118 EXPECT_EQ(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_name.c_str(),
159 KEY_QUERY_VALUE)); 119 KEY_QUERY_VALUE));
160 item->Rollback(); 120 item->Rollback();
161 item.reset(); 121 item.reset();
162 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(), 122 EXPECT_EQ(ERROR_SUCCESS, key.Open(test_data_.root_key(), key_name.c_str(),
163 KEY_QUERY_VALUE)); 123 KEY_QUERY_VALUE));
164 std::wstring str_value; 124 std::wstring str_value;
165 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(NULL, &str_value)); 125 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(NULL, &str_value));
166 EXPECT_EQ(key_name, str_value); 126 EXPECT_EQ(key_name, str_value);
167 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey", KEY_READ | WRITE_DAC)); 127 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey", KEY_READ | WRITE_DAC));
168 dw_value = 0; 128 dw_value = 0;
169 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"SomeValue", &dw_value)); 129 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"SomeValue", &dw_value));
170 EXPECT_EQ(1U, dw_value); 130 EXPECT_EQ(1U, dw_value);
171 // Give users all access to the subkey so it can be deleted. 131 // Give users all access to the subkey so it can be deleted.
172 EXPECT_EQ(ERROR_SUCCESS, 132 EXPECT_EQ(ERROR_SUCCESS,
173 RegSetKeySecurity(key.Handle(), DACL_SECURITY_INFORMATION, 133 RegSetKeySecurity(key.Handle(), DACL_SECURITY_INFORMATION,
174 const_cast<SECURITY_DESCRIPTOR*>( 134 const_cast<SECURITY_DESCRIPTOR*>(
175 sec_desc.GetPSECURITY_DESCRIPTOR()))); 135 sec_desc.GetPSECURITY_DESCRIPTOR())));
176 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey2", KEY_QUERY_VALUE)); 136 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey2", KEY_QUERY_VALUE));
177 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"", &dw_value)); 137 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"", &dw_value));
178 EXPECT_EQ(2U, dw_value); 138 EXPECT_EQ(2U, dw_value);
179 } 139 }
OLDNEW
« no previous file with comments | « chrome/installer/util/delete_reg_key_work_item.cc ('k') | chrome/installer/util/registry_key_backup.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698