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

Side by Side Diff: chrome/installer/setup/install_worker_unittest.cc

Issue 6153003: Refactor install.cc into the work item parts and the non-work item parts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 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 testing/gAuthors. 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 "chrome/installer/setup/install_worker.h"
6
7 #include "base/win/registry.h"
8 #include "base/version.h"
9 #include "chrome/installer/util/installation_state.h"
10 #include "chrome/installer/util/installer_state.h"
11 #include "chrome/installer/util/package.h"
12 #include "chrome/installer/util/package_properties.h"
13 #include "chrome/installer/util/work_item_list.h"
14
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17
18 using installer::ChromiumPackageProperties;
19 using installer::InstallationState;
20 using installer::InstallerState;
21 using installer::Package;
22 using installer::PackageProperties;
23 using installer::PackagePropertiesImpl;
24 using installer::ProductState;
25
26 using ::testing::_;
27 using ::testing::AtLeast;
28
29 // MockClasses to help with testing
30 //------------------------------------------------------------------------------
31
32 class MockWorkItemList : public WorkItemList {
grt (UTC plus 2) 2011/01/12 16:18:02 Cool!
robertshield 2011/01/13 17:06:32 Thanks!
33 public:
34 MockWorkItemList() {}
35
36 MOCK_METHOD5(AddCopyTreeWorkItem, WorkItem*(const std::wstring&,
tommi (sloooow) - chröme 2011/01/12 19:02:49 Ah, I see :) I misunderstood the approach the othe
robertshield 2011/01/13 17:06:32 Thanks!
37 const std::wstring&,
38 const std::wstring&,
39 CopyOverWriteOption,
40 const std::wstring&));
41 MOCK_METHOD1(AddCreateDirWorkItem, WorkItem* (const FilePath&));
42 MOCK_METHOD2(AddCreateRegKeyWorkItem, WorkItem* (HKEY, const std::wstring&));
43 MOCK_METHOD2(AddDeleteRegKeyWorkItem, WorkItem* (HKEY, const std::wstring&));
44 MOCK_METHOD4(AddDeleteRegValueWorkItem, WorkItem* (HKEY,
45 const std::wstring&,
46 const std::wstring&,
47 bool));
48 MOCK_METHOD2(AddDeleteTreeWorkItem, WorkItem* (const FilePath&,
49 const std::vector<FilePath>&));
50 MOCK_METHOD1(AddDeleteTreeWorkItem, WorkItem* (const FilePath&));
51 MOCK_METHOD3(AddMoveTreeWorkItem, WorkItem* (const std::wstring&,
52 const std::wstring&,
53 const std::wstring&));
54 MOCK_METHOD5(AddSetRegValueWorkItem, WorkItem*(HKEY,
55 const std::wstring&,
56 const std::wstring&,
57 const std::wstring&,
58 bool));
59 MOCK_METHOD5(AddSetRegValueWorkItem, WorkItem* (HKEY,
60 const std::wstring&,
61 const std::wstring&,
62 DWORD,
63 bool));
64 MOCK_METHOD3(AddSelfRegWorkItem, WorkItem* (const std::wstring&,
65 bool,
66 bool));
67 };
68
69 // Okay, so this isn't really a mock as such, but it does add setter methods
70 // to make it easier to build custom InstallationStates.
71 class MockInstallationState : public InstallationState {
72 public:
73 // Included for testing.
74 void SetMultiPackageState(bool system_install,
75 const ProductState& package_state) {
76 ProductState& target =
77 (system_install ? system_products_ : user_products_)
78 [MULTI_PACKAGE_INDEX];
79 target.CopyFrom(package_state);
80 }
81
82 // Included for testing.
83 void SetProductState(bool system_install,
84 BrowserDistribution::Type type,
85 const ProductState& product_state) {
86 ProductState& target = (system_install ? system_products_ :
87 user_products_)[IndexFromDistType(type)];
88 target.CopyFrom(product_state);
89 }
90 };
91
92 class MockInstallerState : public InstallerState {
93 public:
94 void set_system_install(bool system_install) {
95 system_install_ = system_install;
96 }
97
98 void set_operation(Operation operation) { operation_ = operation; }
99
100 void set_state_key(const std::wstring& state_key) {
101 state_key_ = state_key;
102 }
103 };
104
105 // The test fixture
106 //------------------------------------------------------------------------------
107
108 class InstallWorkerTest : public testing::Test {
109 public:
110 virtual void SetUp() {
111 new_version_.reset(Version::GetVersionFromString("42.0.0.0"));
112 current_version_.reset(Version::GetVersionFromString("1.0.0.0"));
113
114 // Don't bother ensuring that these paths exist. Since we're just
115 // building the work item lists and not running them, they shouldn't
116 // actually be touched.
117 setup_path_ = FilePath(L"C:\\UnlikelyPath\\Temp\\CR_123.tmp\\setup.exe");
118 archive_path_ = FilePath(L"C:\\UnlikelyPath\\Temp\\chrome_123\\chrome.7z");
119 src_path_ =
120 FilePath(L"C:\\UnlikelyPath\\Temp\\chrome_123\\source\\Chrome-bin");
121 temp_dir_ = FilePath(L"C:\\UnlikelyPath\\Temp\\chrome_123");
122 // TODO(robertshield): Take this from the BrowserDistribution once that
123 // no longer depends on MasterPreferences.
124 installation_path_ = FilePath(L"C:\\Program Files\\Google\\Chrome\\");
125 }
126
127 virtual void TearDown() {
128
129 }
130
131 MockInstallationState* BuildChromeSingleSystemInstallationState() {
132 scoped_ptr<MockInstallationState> installation_state(
133 new MockInstallationState);
grt (UTC plus 2) 2011/01/12 16:18:02 nit: Call me old-fashioned, but I prefer new Foo()
robertshield 2011/01/13 17:06:32 You, sir, are old fashioned.
134
135 ProductState product_state;
136 product_state.set_version(current_version_->Clone());
137 // Do not call SetMultiPackageState since this is a single install.
138 installation_state->SetProductState(true,
139 BrowserDistribution::CHROME_BROWSER,
140 product_state);
141
142 return installation_state.release();
143 }
144
145 MockInstallerState* BuildChromeSingleSystemInstallerState() {
146 scoped_ptr<MockInstallerState> installer_state(new MockInstallerState);
147
148 installer_state->set_system_install(true);
149 installer_state->set_operation(InstallerState::SINGLE_INSTALL_OR_UPDATE);
150 // Hope this next one isn't checked for now.
151 installer_state->set_state_key(L"PROBABLY_INVALID_REG_PATH");
152
153 return installer_state.release();
154 }
155
156 protected:
157 scoped_ptr<Version> current_version_;
158 scoped_ptr<Version> new_version_;
159 FilePath setup_path_;
160 FilePath archive_path_;
161 FilePath src_path_;
162 FilePath temp_dir_;
163
grt (UTC plus 2) 2011/01/12 16:18:02 nit: does this blank line add something?
robertshield 2011/01/13 17:06:32 feng shui.
164 FilePath installation_path_;
165 };
166
167 // Tests
168 //------------------------------------------------------------------------------
169
170 TEST_F(InstallWorkerTest, TestInstallChromeSingleSystem) {
171 MockWorkItemList work_item_list;
172
173 scoped_ptr<InstallationState> installation_state(
174 BuildChromeSingleSystemInstallationState());
175
176 scoped_ptr<InstallerState> installer_state(
177 BuildChromeSingleSystemInstallerState());
178
179 // This MUST outlive the package, since the package doesn't assume ownership
180 // of it. Note: This feels like an implementation bug:
181 // The PackageProperties <-> Package relationship is 1:1 and nothing else
182 // uses the PackageProperties. I have the feeling that PackageProperties, and
183 // perhaps Package itself should not exist at all.
grt (UTC plus 2) 2011/01/12 16:18:02 this will be resolved if/when i finish my change-i
robertshield 2011/01/13 17:06:32 Then in addition to being old-fashioned, you are a
184 scoped_ptr<PackageProperties> package_properties(
185 new ChromiumPackageProperties());
186
187 scoped_refptr<Package> package(
188 new Package(false, true, installation_path_, package_properties.get()));
189
190 // Set up some expectations.
191 // TODO(robertshield): Set up some real expectations.
192 EXPECT_CALL(work_item_list, AddCopyTreeWorkItem(_,_,_,_,_))
amit 2011/01/12 17:41:22 It will be nice if we can create a work item from
robertshield 2011/01/13 17:06:32 That sounds cool, I would like to tackle that in a
193 .Times(AtLeast(1));
194
195 AddInstallWorkItems(*installation_state.get(),
196 *installer_state.get(),
197 false,
198 setup_path_,
199 archive_path_,
200 src_path_,
201 temp_dir_,
202 *new_version_.get(),
203 &current_version_,
204 *package.get(),
205 &work_item_list);
206
grt (UTC plus 2) 2011/01/12 16:18:02 nit: remove extra newline.
robertshield 2011/01/13 17:06:32 Done.
207 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698