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

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

Issue 6598065: Add rollback support to DeleteRegKeyWorkItem.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 9 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
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <windows.h>
6 #include <atlsecurity.h>
7 #include "base/logging.h"
8 #include "base/scoped_ptr.h"
9 #include "base/win/registry.h"
10 #include "chrome/installer/util/delete_reg_key_work_item.h"
11 #include "chrome/installer/util/work_item.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using base::win::RegKey;
15
16 namespace {
17 wchar_t test_root[] = L"SOFTWARE\\TmpTmp";
18 }
19
20 class DeleteRegKeyWorkItemTest : public testing::Test {
21 protected:
22 virtual void SetUp() {
23 // Create a temporary key for testing
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 }
30
31 virtual void TearDown() {
32 logging::CloseLogFile();
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 }
37 };
38
39 // Test that deleting a key that doesn't exist succeeds, and that rollback does
40 // nothing.
41 TEST_F(DeleteRegKeyWorkItemTest, TestNoKey) {
42 RegKey key;
43 std::wstring key_name(std::wstring(test_root) + L"\\NoKeyHere");
44 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
45 KEY_READ));
46 scoped_ptr<DeleteRegKeyWorkItem> item(
47 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name));
48 EXPECT_TRUE(item->Do());
49 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
50 KEY_READ));
51 item->Rollback();
52 item.reset();
53 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
54 KEY_READ));
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 }
74
75 // Test that deleting an empty key succeeds, and that rollback brings it back.
76 TEST_F(DeleteRegKeyWorkItemTest, TestEmptyKey) {
77 RegKey key;
78 std::wstring key_name(std::wstring(test_root) + L"\\EmptyKey");
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(
83 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name));
84 EXPECT_TRUE(item->Do());
85 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
86 KEY_READ));
87 item->Rollback();
88 item.reset();
89 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
90 KEY_READ));
91 }
92
93 // Test that deleting a key with subkeys and values succeeds, and that rollback
94 // brings them all back.
95 TEST_F(DeleteRegKeyWorkItemTest, TestNonEmptyKey) {
96 RegKey key;
97 std::wstring key_name(std::wstring(test_root) + L"\\NonEmptyKey");
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(
105 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name));
106 EXPECT_TRUE(item->Do());
107 EXPECT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
108 KEY_READ));
109 item->Rollback();
110 item.reset();
111 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.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 }
121
122 // Test that deleting a key with subkeys we can't delete fails, and that
123 // everything is there after rollback.
124 TEST_F(DeleteRegKeyWorkItemTest, TestUndeletableKey) {
125 RegKey key;
126 std::wstring key_name(std::wstring(test_root) + L"\\UndeletableKey");
127 EXPECT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, key_name.c_str(),
128 KEY_WRITE));
129 EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(NULL, key_name.c_str()));
130 DWORD dw_value = 1;
131 RegKey subkey;
132 RegKey subkey2;
133 EXPECT_EQ(ERROR_SUCCESS, subkey.Create(key.Handle(), L"Subkey",
134 KEY_WRITE | WRITE_DAC));
135 EXPECT_EQ(ERROR_SUCCESS, subkey.WriteValue(L"SomeValue", 1U));
136 EXPECT_EQ(ERROR_SUCCESS, subkey2.Create(subkey.Handle(), L"Subkey2",
137 KEY_WRITE | WRITE_DAC));
138 EXPECT_EQ(ERROR_SUCCESS, subkey2.WriteValue(L"", 2U));
139 CSecurityDesc sec_desc;
140 sec_desc.FromString(L"D:PAI(A;OICI;KR;;;BU)"); // builtin users read
robertshield 2011/03/01 21:05:54 Awesome!
grt (UTC plus 2) 2011/03/01 21:11:35 Thanks.
141 EXPECT_EQ(ERROR_SUCCESS,
142 RegSetKeySecurity(subkey.Handle(), DACL_SECURITY_INFORMATION,
143 const_cast<SECURITY_DESCRIPTOR*>(
144 sec_desc.GetPSECURITY_DESCRIPTOR())));
145 sec_desc.FromString(L"D:PAI(A;OICI;KA;;;BU)"); // builtin users all access
146 EXPECT_EQ(ERROR_SUCCESS,
147 RegSetKeySecurity(subkey2.Handle(), DACL_SECURITY_INFORMATION,
148 const_cast<SECURITY_DESCRIPTOR*>(
149 sec_desc.GetPSECURITY_DESCRIPTOR())));
150 subkey2.Close();
151 subkey.Close();
152 key.Close();
153 scoped_ptr<DeleteRegKeyWorkItem> item(
154 WorkItem::CreateDeleteRegKeyWorkItem(HKEY_CURRENT_USER, key_name));
155 EXPECT_FALSE(item->Do());
156 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
157 KEY_QUERY_VALUE));
158 item->Rollback();
159 item.reset();
160 EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, key_name.c_str(),
161 KEY_QUERY_VALUE));
162 std::wstring str_value;
163 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(NULL, &str_value));
164 EXPECT_EQ(key_name, str_value);
165 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey", KEY_READ | WRITE_DAC));
166 dw_value = 0;
167 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"SomeValue", &dw_value));
168 EXPECT_EQ(1U, dw_value);
169 // Give users all access to the subkey so it can be deleted.
170 EXPECT_EQ(ERROR_SUCCESS,
171 RegSetKeySecurity(key.Handle(), DACL_SECURITY_INFORMATION,
172 const_cast<SECURITY_DESCRIPTOR*>(
173 sec_desc.GetPSECURITY_DESCRIPTOR())));
174 EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey2", KEY_QUERY_VALUE));
175 EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"", &dw_value));
176 EXPECT_EQ(2U, dw_value);
177 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698