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

Side by Side Diff: chrome/browser/google/google_update_win_unittest.cc

Issue 1117263002: Switch on-demand update checks to the less-old GoogleUpdate3 API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: chromium tweak Created 5 years, 7 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/google/google_update_win.h" 5 #include "chrome/browser/google/google_update_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <atlbase.h> 8 #include <atlbase.h>
9 #include <atlcom.h> 9 #include <atlcom.h>
10 10
11 #include <queue> 11 #include <queue>
12 12
13 #include "base/base_paths.h" 13 #include "base/base_paths.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/path_service.h" 15 #include "base/path_service.h"
16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/stringprintf.h" 16 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
19 #include "base/test/scoped_path_override.h" 18 #include "base/test/scoped_path_override.h"
20 #include "base/test/test_reg_util_win.h" 19 #include "base/test/test_reg_util_win.h"
21 #include "base/test/test_simple_task_runner.h" 20 #include "base/test/test_simple_task_runner.h"
22 #include "base/thread_task_runner_handle.h" 21 #include "base/thread_task_runner_handle.h"
23 #include "base/version.h" 22 #include "base/version.h"
24 #include "base/win/registry.h" 23 #include "base/win/registry.h"
24 #include "base/win/scoped_comptr.h"
25 #include "chrome/installer/util/browser_distribution.h" 25 #include "chrome/installer/util/browser_distribution.h"
26 #include "chrome/installer/util/google_update_settings.h" 26 #include "chrome/installer/util/google_update_settings.h"
27 #include "chrome/installer/util/helper.h" 27 #include "chrome/installer/util/helper.h"
28 #include "google_update/google_update_idl.h" 28 #include "google_update/google_update_idl.h"
29 #include "testing/gmock/include/gmock/gmock.h" 29 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
31 #include "ui/base/win/atl_module.h" 31 #include "ui/base/win/atl_module.h"
32 #include "version.h" 32 #include "version.h"
33 33
34 using ::testing::Assign;
34 using ::testing::DoAll; 35 using ::testing::DoAll;
36 using ::testing::DoubleEq;
37 using ::testing::HasSubstr;
38 using ::testing::InSequence;
35 using ::testing::Invoke; 39 using ::testing::Invoke;
36 using ::testing::IsEmpty; 40 using ::testing::IsEmpty;
37 using ::testing::Return; 41 using ::testing::Return;
42 using ::testing::Sequence;
38 using ::testing::SetArgPointee; 43 using ::testing::SetArgPointee;
39 using ::testing::StrEq; 44 using ::testing::StrEq;
40 using ::testing::Unused; 45 using ::testing::StrictMock;
41 using ::testing::Values; 46 using ::testing::Values;
42 using ::testing::_; 47 using ::testing::_;
43 48
44 namespace { 49 namespace {
45 50
46 class UpdateCheckCallbackReceiver { 51 class MockUpdateCheckDelegate : public UpdateCheckDelegate {
47 public: 52 public:
48 UpdateCheckCallbackReceiver() {} 53 MockUpdateCheckDelegate() : weak_ptr_factory_(this) {}
49 virtual ~UpdateCheckCallbackReceiver() {} 54
50 virtual void OnUpdateCheckCallback(GoogleUpdateUpgradeResult result, 55 base::WeakPtr<UpdateCheckDelegate> AsWeakPtr() {
51 GoogleUpdateErrorCode error_code, 56 return weak_ptr_factory_.GetWeakPtr();
52 const base::string16& error_message, 57 }
53 const base::string16& version) = 0; 58
54 UpdateCheckCallback GetCallback() { 59 MOCK_METHOD1(OnUpdateCheckComplete, void(const base::string16&));
55 return base::Bind(&UpdateCheckCallbackReceiver::UpdateCheckCallback, 60 MOCK_METHOD2(OnUpgradeProgress, void(int, const base::string16&));
56 base::Unretained(this)); 61 MOCK_METHOD1(OnUpgradeComplete, void(const base::string16&));
57 } 62 MOCK_METHOD3(OnError, void(GoogleUpdateErrorCode,
63 const base::string16&,
64 const base::string16&));
58 65
59 private: 66 private:
60 void UpdateCheckCallback(GoogleUpdateUpgradeResult result, 67 base::WeakPtrFactory<UpdateCheckDelegate> weak_ptr_factory_;
61 GoogleUpdateErrorCode error_code, 68
62 const base::string16& error_message, 69 DISALLOW_COPY_AND_ASSIGN(MockUpdateCheckDelegate);
63 const base::string16& version) { 70 };
64 OnUpdateCheckCallback(result, error_code, error_message, version); 71
65 } 72 // An interface that exposes a factory method for creating an IGoogleUpdate3
66 73 // instance.
67 DISALLOW_COPY_AND_ASSIGN(UpdateCheckCallbackReceiver);
68 };
69
70 class MockUpdateCheckCallbackReceiver : public UpdateCheckCallbackReceiver {
71 public:
72 MockUpdateCheckCallbackReceiver() {}
73 MOCK_METHOD4(OnUpdateCheckCallback,
74 void(GoogleUpdateUpgradeResult,
75 GoogleUpdateErrorCode,
76 const base::string16&,
77 const base::string16&));
78
79 private:
80 DISALLOW_COPY_AND_ASSIGN(MockUpdateCheckCallbackReceiver);
81 };
82
83 class GoogleUpdateFactory { 74 class GoogleUpdateFactory {
84 public: 75 public:
85 virtual ~GoogleUpdateFactory() {} 76 virtual ~GoogleUpdateFactory() {}
86 virtual HRESULT Create(base::win::ScopedComPtr<IGoogleUpdate>* on_demand) = 0; 77 virtual HRESULT Create(
87 }; 78 base::win::ScopedComPtr<IGoogleUpdate3>* google_update) = 0;
88 79 };
80
81 // A mock factory for creating an IGoogleUpdate3 instance.
89 class MockGoogleUpdateFactory : public GoogleUpdateFactory { 82 class MockGoogleUpdateFactory : public GoogleUpdateFactory {
90 public: 83 public:
91 MockGoogleUpdateFactory() {} 84 MockGoogleUpdateFactory() {}
92 MOCK_METHOD1(Create, HRESULT(base::win::ScopedComPtr<IGoogleUpdate>*)); 85 MOCK_METHOD1(Create, HRESULT(base::win::ScopedComPtr<IGoogleUpdate3>*));
93 86
94 private: 87 private:
95 DISALLOW_COPY_AND_ASSIGN(MockGoogleUpdateFactory); 88 DISALLOW_COPY_AND_ASSIGN(MockGoogleUpdateFactory);
96 }; 89 };
97 90
98 // A mock IGoogleUpdate on-demand update class that can run an IJobObserver 91 class MockCurrentState : public CComObjectRootEx<CComSingleThreadModel>,
99 // through a set of states. 92 public ICurrentState {
100 class MockOnDemand : public CComObjectRootEx<CComSingleThreadModel>, 93 public:
101 public IGoogleUpdate { 94 BEGIN_COM_MAP(MockCurrentState)
102 public: 95 COM_INTERFACE_ENTRY(ICurrentState)
103 BEGIN_COM_MAP(MockOnDemand)
104 COM_INTERFACE_ENTRY(IGoogleUpdate)
105 END_COM_MAP() 96 END_COM_MAP()
106 97
107 MockOnDemand() : task_runner_(base::ThreadTaskRunnerHandle::Get()) {} 98 MockCurrentState() {}
108 99
109 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, 100 // Adds an expectation for get_completionMessage that will return the given
110 CheckForUpdate, 101 // message any number of times.
111 HRESULT(const wchar_t*, IJobObserver*)); 102 void ExpectCompletionMessage(const base::string16& completion_message) {
112 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, 103 completion_message_ = completion_message;
113 Update, 104 EXPECT_CALL(*this, get_completionMessage(_))
114 HRESULT(const wchar_t*, IJobObserver*)); 105 .WillRepeatedly(
115 106 ::testing::Invoke(this, &MockCurrentState::GetCompletionMessage));
116 void OnCheckRunUpToDateSequence(const base::char16* app_guid) { 107 }
117 EXPECT_CALL(*this, CheckForUpdate(StrEq(app_guid), _)) 108
118 .WillOnce(DoAll(Invoke(this, &MockOnDemand::BeginUpToDateSequence), 109 HRESULT GetCompletionMessage(BSTR* completion_message) {
119 Return(S_OK))); 110 *completion_message = SysAllocString(completion_message_.c_str());
120 } 111 return S_OK;
121 112 }
122 void OnCheckRunUpdateAvailableSequence(const base::char16* app_guid, 113
123 const base::string16& new_version) { 114 // Adds an expectation for get_availableVersion that will return the given
124 new_version_ = new_version; 115 // version any number of times.
125 EXPECT_CALL(*this, CheckForUpdate(StrEq(app_guid), _)) 116 void ExpectAvailableVersion(const base::string16& available_version) {
126 .WillOnce( 117 available_version_ = available_version;
127 DoAll(Invoke(this, &MockOnDemand::BeginUpdateAvailableSequence), 118 EXPECT_CALL(*this, get_availableVersion(_))
128 Return(S_OK))); 119 .WillRepeatedly(
129 } 120 ::testing::Invoke(this, &MockCurrentState::GetAvailableVersion));
130 121 }
131 void OnUpdateRunInstallUpdateSequence(const base::char16* app_guid, 122
132 const base::string16& new_version) { 123 HRESULT GetAvailableVersion(BSTR* available_version) {
133 new_version_ = new_version; 124 *available_version = SysAllocString(available_version_.c_str());
134 EXPECT_CALL(*this, Update(StrEq(app_guid), _)) 125 return S_OK;
135 .WillOnce(DoAll(Invoke(this, &MockOnDemand::BeginInstallUpdateSequence), 126 }
136 Return(S_OK))); 127
137 } 128 // ICurrentState
138 129 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
139 void OnUpdateRunUpdateErrorSequence(const base::char16* app_guid, 130 get_stateValue,
140 const base::char16* error_text) { 131 HRESULT(LONG *));
141 error_text_ = error_text; 132 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
142 EXPECT_CALL(*this, Update(StrEq(app_guid), _)) 133 get_availableVersion,
143 .WillOnce(DoAll(Invoke(this, &MockOnDemand::BeginUpdateErrorSequence), 134 HRESULT(BSTR *));
144 Return(S_OK))); 135 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
145 } 136 get_bytesDownloaded,
137 HRESULT(ULONG *));
138 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
139 get_totalBytesToDownload,
140 HRESULT(ULONG *));
141 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
142 get_downloadTimeRemainingMs,
143 HRESULT(LONG *));
144 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
145 get_nextRetryTime,
146 HRESULT(ULONGLONG *));
147 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
148 get_installProgress,
149 HRESULT(LONG *));
150 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
151 get_installTimeRemainingMs,
152 HRESULT(LONG *));
153 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
154 get_isCanceled,
155 HRESULT(VARIANT_BOOL *));
156 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
157 get_errorCode,
158 HRESULT(LONG *));
159 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
160 get_extraCode1,
161 HRESULT(LONG *));
162 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
163 get_completionMessage,
164 HRESULT(BSTR *));
165 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
166 get_installerResultCode,
167 HRESULT(LONG *));
168 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
169 get_installerResultExtraCode1,
170 HRESULT(LONG *));
171 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
172 get_postInstallLaunchCommandLine,
173 HRESULT(BSTR *));
174 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
175 get_postInstallUrl,
176 HRESULT(BSTR *));
177 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
178 get_postInstallAction,
179 HRESULT(LONG *));
180
181 // IDispatch
182 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
183 GetTypeInfoCount,
184 HRESULT(UINT *));
185 MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
186 GetTypeInfo,
187 HRESULT(UINT, LCID, ITypeInfo **));
188 MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
189 GetIDsOfNames,
190 HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
191 MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
192 Invoke,
193 HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
194 VARIANT *, EXCEPINFO *, UINT *));
146 195
147 private: 196 private:
148 enum State { 197 base::string16 completion_message_;
149 STATE_CHECKING, 198 base::string16 available_version_;
150 STATE_COMPLETE_SUCCESS, 199
151 STATE_UPDATE_AVAILABLE, 200 DISALLOW_COPY_AND_ASSIGN(MockCurrentState);
152 STATE_WAITING_TO_DOWNLOAD, 201 };
153 STATE_DOWNLOADING_25, 202
154 STATE_DOWNLOADING_100, 203 class MockApp : public CComObjectRootEx<CComSingleThreadModel>, public IApp {
155 STATE_WAITING_TO_INSTALL, 204 public:
156 STATE_INSTALLING, 205 BEGIN_COM_MAP(MockApp)
157 STATE_COMPLETE_ERROR, 206 COM_INTERFACE_ENTRY(IApp)
158 }; 207 END_COM_MAP()
159 208
160 void BeginUpToDateSequence(Unused, IJobObserver* job_observer_ptr) { 209 MockApp() {}
161 job_observer_ = job_observer_ptr; 210
162 states_.push(STATE_CHECKING); 211 // IApp
163 states_.push(STATE_COMPLETE_SUCCESS); 212 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
164 task_runner_->PostTask( 213 get_currentVersion,
165 FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this))); 214 HRESULT(IDispatch **));
166 } 215 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
167 216 get_nextVersion,
168 void BeginUpdateAvailableSequence(Unused, IJobObserver* job_observer_ptr) { 217 HRESULT(IDispatch **));
169 job_observer_ = job_observer_ptr; 218 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
170 states_.push(STATE_CHECKING); 219 get_appId,
171 states_.push(STATE_UPDATE_AVAILABLE); 220 HRESULT(BSTR *));
172 states_.push(STATE_COMPLETE_SUCCESS); 221 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
173 task_runner_->PostTask( 222 get_displayName,
174 FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this))); 223 HRESULT(BSTR *));
175 } 224 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
176 225 put_displayName,
177 void BeginInstallUpdateSequence(Unused, IJobObserver* job_observer_ptr) { 226 HRESULT(BSTR));
178 job_observer_ = job_observer_ptr; 227 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
179 states_.push(STATE_CHECKING); 228 get_language,
180 states_.push(STATE_UPDATE_AVAILABLE); 229 HRESULT(BSTR *));
181 states_.push(STATE_WAITING_TO_DOWNLOAD); 230 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
182 states_.push(STATE_DOWNLOADING_25); 231 put_language,
183 states_.push(STATE_DOWNLOADING_100); 232 HRESULT(BSTR));
184 states_.push(STATE_WAITING_TO_INSTALL); 233 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
185 states_.push(STATE_INSTALLING); 234 get_ap,
186 states_.push(STATE_COMPLETE_SUCCESS); 235 HRESULT(BSTR *));
187 task_runner_->PostTask( 236 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
188 FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this))); 237 put_ap,
189 } 238 HRESULT(BSTR));
190 239 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
191 void BeginUpdateErrorSequence(Unused, IJobObserver* job_observer_ptr) { 240 get_ttToken,
192 job_observer_ = job_observer_ptr; 241 HRESULT(BSTR *));
193 states_.push(STATE_CHECKING); 242 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
194 states_.push(STATE_UPDATE_AVAILABLE); 243 put_ttToken,
195 states_.push(STATE_WAITING_TO_DOWNLOAD); 244 HRESULT(BSTR));
196 states_.push(STATE_DOWNLOADING_25); 245 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
197 states_.push(STATE_DOWNLOADING_100); 246 get_iid,
198 states_.push(STATE_WAITING_TO_INSTALL); 247 HRESULT(BSTR *));
199 states_.push(STATE_INSTALLING); 248 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
200 states_.push(STATE_COMPLETE_ERROR); 249 put_iid,
201 task_runner_->PostTask( 250 HRESULT(BSTR));
202 FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this))); 251 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
203 } 252 get_brandCode,
204 253 HRESULT(BSTR *));
205 // Advance to the next state. If this state is non-terminal, a task is posted 254 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
206 // to advance to the next state a bit later. 255 put_brandCode,
207 void Advance() { 256 HRESULT(BSTR));
208 ASSERT_FALSE(states_.empty()); 257 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
209 switch (states_.front()) { 258 get_clientId,
210 case STATE_CHECKING: 259 HRESULT(BSTR *));
211 EXPECT_EQ(S_OK, job_observer_->OnCheckingForUpdate()); 260 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
212 break; 261 put_clientId,
213 case STATE_COMPLETE_SUCCESS: 262 HRESULT(BSTR));
214 EXPECT_EQ(S_OK, 263 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
215 job_observer_->OnComplete(COMPLETION_CODE_SUCCESS, nullptr)); 264 get_labels,
216 break; 265 HRESULT(BSTR *));
217 case STATE_UPDATE_AVAILABLE: 266 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
218 EXPECT_EQ(S_OK, job_observer_->OnUpdateAvailable(new_version_.c_str())); 267 put_labels,
219 break; 268 HRESULT(BSTR));
220 case STATE_WAITING_TO_DOWNLOAD: 269 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
221 EXPECT_EQ(S_OK, job_observer_->OnWaitingToDownload()); 270 get_referralId,
222 break; 271 HRESULT(BSTR *));
223 case STATE_DOWNLOADING_25: 272 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
224 EXPECT_EQ(S_OK, job_observer_->OnDownloading(47, 25)); 273 put_referralId,
225 break; 274 HRESULT(BSTR));
226 case STATE_DOWNLOADING_100: 275 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
227 EXPECT_EQ(S_OK, job_observer_->OnDownloading(42, 100)); 276 get_command,
228 break; 277 HRESULT(BSTR, IDispatch **));
229 case STATE_WAITING_TO_INSTALL: 278 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
230 EXPECT_EQ(S_OK, job_observer_->OnWaitingToInstall()); 279 get_browserType,
231 break; 280 HRESULT(UINT *));
232 case STATE_INSTALLING: 281 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
233 EXPECT_EQ(S_OK, job_observer_->OnInstalling()); 282 put_browserType,
234 break; 283 HRESULT(UINT));
235 case STATE_COMPLETE_ERROR: 284 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
236 EXPECT_EQ(S_OK, job_observer_->OnComplete(COMPLETION_CODE_ERROR, 285 get_clientInstallData,
237 error_text_.c_str())); 286 HRESULT(BSTR *));
238 break; 287 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
239 } 288 put_clientInstallData,
240 states_.pop(); 289 HRESULT(BSTR));
241 if (states_.empty()) { 290 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
242 // Drop the reference to the observer when the terminal state is reached. 291 get_serverInstallDataIndex,
243 job_observer_ = nullptr; 292 HRESULT(BSTR *));
244 } else { 293 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
245 task_runner_->PostTask(FROM_HERE, base::Bind(&MockOnDemand::Advance, 294 put_serverInstallDataIndex,
246 base::Unretained(this))); 295 HRESULT(BSTR));
247 } 296 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
248 } 297 get_isEulaAccepted,
249 298 HRESULT(VARIANT_BOOL *));
250 // The task runner on which the state machine runs. 299 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
251 scoped_refptr<base::TaskRunner> task_runner_; 300 put_isEulaAccepted,
252 301 HRESULT(VARIANT_BOOL));
253 // The new version for a successful update check or update. 302 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
254 base::string16 new_version_; 303 get_usageStatsEnable,
255 304 HRESULT(UINT *));
256 // Error text to be supplied for an unsuccessful update check or update. 305 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
257 base::string16 error_text_; 306 put_usageStatsEnable,
258 307 HRESULT(UINT));
259 // The set of states to be run on an IJobObserver. 308 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
260 std::queue<State> states_; 309 get_installTimeDiffSec,
261 310 HRESULT(UINT *));
262 // The IJobObserver given to either CheckForUpdate() or Update() that is being 311 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
263 // driven through the desired state transitions. 312 get_currentState,
264 base::win::ScopedComPtr<IJobObserver> job_observer_; 313 HRESULT(IDispatch **));
265 314
266 DISALLOW_COPY_AND_ASSIGN(MockOnDemand); 315 // IDispatch
316 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
317 GetTypeInfoCount,
318 HRESULT(UINT *));
319 MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
320 GetTypeInfo,
321 HRESULT(UINT, LCID, ITypeInfo **));
322 MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
323 GetIDsOfNames,
324 HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
325 MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
326 Invoke,
327 HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
328 VARIANT *, EXCEPINFO *, UINT *));
329
330 private:
331 DISALLOW_COPY_AND_ASSIGN(MockApp);
332 };
333
334 class MockAppBundle : public CComObjectRootEx<CComSingleThreadModel>,
335 public IAppBundle {
336 public:
337 BEGIN_COM_MAP(MockAppBundle)
338 COM_INTERFACE_ENTRY(IAppBundle)
339 END_COM_MAP()
340
341 MockAppBundle() {}
342
343 // IAppBundle
344 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
345 get_displayName,
346 HRESULT(BSTR *));
347 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
348 put_displayName,
349 HRESULT(BSTR));
350 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
351 get_displayLanguage,
352 HRESULT(BSTR *));
353 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
354 put_displayLanguage,
355 HRESULT(BSTR));
356 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
357 get_installSource,
358 HRESULT(BSTR *));
359 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
360 put_installSource,
361 HRESULT(BSTR));
362 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
363 get_originURL,
364 HRESULT(BSTR *));
365 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
366 put_originURL,
367 HRESULT(BSTR));
368 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
369 get_offlineDirectory,
370 HRESULT(BSTR *));
371 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
372 put_offlineDirectory,
373 HRESULT(BSTR));
374 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
375 get_sessionId,
376 HRESULT(BSTR *));
377 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
378 put_sessionId,
379 HRESULT(BSTR));
380 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
381 get_sendPings,
382 HRESULT(VARIANT_BOOL *));
383 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
384 put_sendPings,
385 HRESULT(VARIANT_BOOL));
386 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
387 get_priority,
388 HRESULT(long *));
389 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
390 put_priority,
391 HRESULT(long));
392 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
393 get_Count,
394 HRESULT(long *));
395 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
396 get_Item,
397 HRESULT(long, IDispatch **));
398 MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
399 put_altTokens,
400 HRESULT(ULONG_PTR, ULONG_PTR, DWORD));
401 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
402 put_parentHWND,
403 HRESULT(ULONG_PTR));
404 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
405 initialize,
406 HRESULT());
407 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
408 createApp,
409 HRESULT(BSTR, IDispatch **));
410 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
411 createInstalledApp,
412 HRESULT(BSTR, IDispatch **));
413 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
414 createAllInstalledApps,
415 HRESULT());
416 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
417 checkForUpdate,
418 HRESULT());
419 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
420 download,
421 HRESULT());
422 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
423 install,
424 HRESULT());
425 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
426 updateAllApps,
427 HRESULT());
428 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
429 stop,
430 HRESULT());
431 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
432 pause,
433 HRESULT());
434 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
435 resume,
436 HRESULT());
437 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
438 isBusy,
439 HRESULT(VARIANT_BOOL *));
440 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
441 downloadPackage,
442 HRESULT(BSTR, BSTR));
443 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
444 get_currentState,
445 HRESULT(VARIANT *));
446
447 // IDispatch
448 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
449 GetTypeInfoCount,
450 HRESULT(UINT *));
451 MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
452 GetTypeInfo,
453 HRESULT(UINT, LCID, ITypeInfo **));
454 MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
455 GetIDsOfNames,
456 HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
457 MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
458 Invoke,
459 HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
460 VARIANT *, EXCEPINFO *, UINT *));
461
462 private:
463 DISALLOW_COPY_AND_ASSIGN(MockAppBundle);
464 };
465
466 class MockGoogleUpdate : public CComObjectRootEx<CComSingleThreadModel>,
467 public IGoogleUpdate3 {
468 public:
469 BEGIN_COM_MAP(MockGoogleUpdate)
470 COM_INTERFACE_ENTRY(IGoogleUpdate3)
471 END_COM_MAP()
472
473 MockGoogleUpdate() {}
474
475 // IGoogleUpdate3
476 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
477 get_Count,
478 HRESULT(long*));
479 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
480 get_Item,
481 HRESULT(long, IDispatch**));
482 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
483 createAppBundle,
484 HRESULT(IDispatch**));
485
486 // IDispatch
487 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
488 GetTypeInfoCount,
489 HRESULT(UINT *));
490 MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
491 GetTypeInfo,
492 HRESULT(UINT, LCID, ITypeInfo **));
493 MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
494 GetIDsOfNames,
495 HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
496 MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
497 Invoke,
498 HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
499 VARIANT *, EXCEPINFO *, UINT *));
500
501 DISALLOW_COPY_AND_ASSIGN(MockGoogleUpdate);
267 }; 502 };
268 503
269 } // namespace 504 } // namespace
270 505
506 // A test fixture that can simulate the IGoogleUpdate3 API via Google Mock.
507 // Individual tests must wire up the factories by a call to one of the
508 // PrepareSimulator methods. The family of Push*State methods are then used to
509 // configure the set of states to be simulated.
271 class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> { 510 class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
272 public: 511 public:
273 static void SetUpTestCase() { ui::win::CreateATLModuleIfNeeded(); } 512 static void SetUpTestCase() {
513 ui::win::CreateATLModuleIfNeeded();
514 // Configure all mock functions that return HRESULT to return failure.
515 ::testing::DefaultValue<HRESULT>::Set(E_FAIL);
516 }
517
518 static void TearDownTestCase() { ::testing::DefaultValue<HRESULT>::Clear(); }
274 519
275 protected: 520 protected:
276 GoogleUpdateWinTest() 521 GoogleUpdateWinTest()
277 : task_runner_(new base::TestSimpleTaskRunner()), 522 : task_runner_(new base::TestSimpleTaskRunner()),
278 task_runner_handle_(task_runner_), 523 task_runner_handle_(task_runner_),
279 system_level_(GetParam()), 524 system_level_(GetParam()),
280 mock_on_demand_(nullptr) {} 525 mock_app_(nullptr),
526 mock_app_bundle_(nullptr) {}
281 527
282 void SetUp() override { 528 void SetUp() override {
283 ::testing::TestWithParam<bool>::SetUp(); 529 ::testing::TestWithParam<bool>::SetUp();
284 530
285 // Override FILE_EXE so that it looks like the test is running from the 531 // Override FILE_EXE so that it looks like the test is running from the
286 // standard install location for this mode (system-level or user-level). 532 // standard install location for this mode (system-level or user-level).
287 base::FilePath file_exe; 533 base::FilePath file_exe;
288 ASSERT_TRUE(PathService::Get(base::FILE_EXE, &file_exe)); 534 ASSERT_TRUE(PathService::Get(base::FILE_EXE, &file_exe));
289 base::FilePath install_dir(installer::GetChromeInstallPath( 535 base::FilePath install_dir(installer::GetChromeInstallPath(
290 system_level_, BrowserDistribution::GetDistribution())); 536 system_level_, BrowserDistribution::GetDistribution()));
(...skipping 27 matching lines...) Expand all
318 key.WriteValue( 564 key.WriteValue(
319 L"pv", base::ASCIIToUTF16(CHROME_VERSION_STRING).c_str())); 565 L"pv", base::ASCIIToUTF16(CHROME_VERSION_STRING).c_str()));
320 ASSERT_EQ(ERROR_SUCCESS, 566 ASSERT_EQ(ERROR_SUCCESS,
321 key.Create(root, kClientState, KEY_WRITE | KEY_WOW64_32KEY)); 567 key.Create(root, kClientState, KEY_WRITE | KEY_WOW64_32KEY));
322 ASSERT_EQ(ERROR_SUCCESS, 568 ASSERT_EQ(ERROR_SUCCESS,
323 key.CreateKey(kChromeGuid, KEY_WRITE | KEY_WOW64_32KEY)); 569 key.CreateKey(kChromeGuid, KEY_WRITE | KEY_WOW64_32KEY));
324 ASSERT_EQ(ERROR_SUCCESS, 570 ASSERT_EQ(ERROR_SUCCESS,
325 key.WriteValue(L"UninstallArguments", 571 key.WriteValue(L"UninstallArguments",
326 L"--uninstall --multi-install --chrome")); 572 L"--uninstall --multi-install --chrome"));
327 573
328 // Provide an IGoogleUpdate on-demand update class factory so that this test 574 // Provide an IGoogleUpdate3 class factory so that this test can provide a
329 // can provide a mocked-out instance. 575 // mocked-out instance.
330 SetGoogleUpdateFactoryForTesting( 576 SetGoogleUpdateFactoryForTesting(
331 base::Bind(&GoogleUpdateFactory::Create, 577 base::Bind(&GoogleUpdateFactory::Create,
332 base::Unretained(&mock_google_update_factory_))); 578 base::Unretained(&mock_google_update_factory_)));
333 // Configure the factory to return a generic failure by default.
334 ON_CALL(mock_google_update_factory_, Create(_))
335 .WillByDefault(Return(E_FAIL));
336
337 // Create a mock IGoogleUpdate on-demand update class
338 ASSERT_EQ(S_OK, CComObject<MockOnDemand>::CreateInstance(&mock_on_demand_));
339 on_demand_holder_ = mock_on_demand_;
340 // Configure the mock to return a generic failure by default.
341 ON_CALL(*mock_on_demand_, CheckForUpdate(_, _))
342 .WillByDefault(Return(E_FAIL));
343 ON_CALL(*mock_on_demand_, Update(_, _)).WillByDefault(Return(E_FAIL));
344 579
345 // Compute a newer version. 580 // Compute a newer version.
346 base::Version current_version(CHROME_VERSION_STRING); 581 base::Version current_version(CHROME_VERSION_STRING);
347 new_version_ = base::StringPrintf(L"%u.%u.%u.%u", 582 new_version_ = base::StringPrintf(L"%u.%u.%u.%u",
348 current_version.components()[0], 583 current_version.components()[0],
349 current_version.components()[1], 584 current_version.components()[1],
350 current_version.components()[2] + 1, 585 current_version.components()[2] + 1,
351 current_version.components()[3]); 586 current_version.components()[3]);
352 } 587 }
353 588
354 void TearDown() override { 589 void TearDown() override {
590 ASSERT_EQ(nullptr, mock_app_);
591 ASSERT_EQ(nullptr, mock_app_bundle_);
592 ASSERT_TRUE(states_.empty());
355 // Remove the test's IGoogleUpdate on-demand update class factory. 593 // Remove the test's IGoogleUpdate on-demand update class factory.
356 SetGoogleUpdateFactoryForTesting(OnDemandAppsClassFactory()); 594 SetGoogleUpdateFactoryForTesting(GoogleUpdate3ClassFactory());
595 ::testing::TestWithParam<bool>::TearDown();
357 } 596 }
358 597
359 // Set the default update policy in the registry. 598 // Prepares the IGoogleUpdate3 simulator.
360 void SetDefaultUpdatePolicy(GoogleUpdateSettings::UpdatePolicy policy) const { 599 void PrepareSimulator(const base::char16* app_guid) {
361 base::win::RegKey policy_key(HKEY_LOCAL_MACHINE, kPoliciesKey, 600 // Make the installed app and configure it to call the test fixture's
362 KEY_SET_VALUE); 601 // GetNextState method.
363 ASSERT_EQ(ERROR_SUCCESS, policy_key.WriteValue(kUpdateDefault, policy)); 602 ASSERT_EQ(S_OK, CComObject<MockApp>::CreateInstance(&mock_app_));
603 ON_CALL(*mock_app_, get_currentState(_))
604 .WillByDefault(Invoke(this, &GoogleUpdateWinTest::GetNextState));
605
606 // Make the app bundle containing the app.
607 ASSERT_EQ(S_OK,
608 CComObject<MockAppBundle>::CreateInstance(&mock_app_bundle_));
609 EXPECT_CALL(*mock_app_bundle_, initialize())
610 .WillOnce(Return(S_OK));
611 // Give mock_app_bundle a ref to the app which it will return when created.
612 mock_app_->AddRef();
613 EXPECT_CALL(*mock_app_bundle_, createInstalledApp(StrEq(app_guid), _))
614 .WillOnce(DoAll(SetArgPointee<1>(mock_app_),
615 Assign(&mock_app_, nullptr),
616 Return(S_OK)));
617
618 // Make the updater which will return the app bundle above.
619 CComObject<MockGoogleUpdate>* mock_google_update = nullptr;
620 ASSERT_EQ(S_OK, CComObject<MockGoogleUpdate>::CreateInstance(
621 &mock_google_update));
622 // Give mock_google_update a ref to the bundle which it will return when
623 // created.
624 mock_app_bundle_->AddRef();
625 EXPECT_CALL(*mock_google_update, createAppBundle(_))
626 .WillOnce(DoAll(SetArgPointee<0>(mock_app_bundle_),
627 Assign(&mock_app_bundle_, nullptr),
628 Return(S_OK)));
629
630 // Give the factory this updater. Do not add a ref, as the factory will add
631 // one when it hands out its instance.
632 EXPECT_CALL(mock_google_update_factory_, Create(_))
633 .WillOnce(DoAll(SetArgPointee<0>(mock_google_update), Return(S_OK)));
364 } 634 }
365 635
366 // Stuffs |policy| in the registry for the app identified by |app_guid|. 636 // Prepares the IGoogleUpdate3 simulator to process an update check.
367 void SetAppUpdatePolicy(const base::char16* app_guid, 637 void PrepareSimulatorForUpdateCheck(const base::char16* app_guid) {
368 GoogleUpdateSettings::UpdatePolicy policy) const { 638 PrepareSimulator(app_guid);
369 base::string16 value_name(L"Update"); 639 // Expect the bundle to be called on to start the update.
370 value_name += app_guid; 640 EXPECT_CALL(*mock_app_bundle_, checkForUpdate())
371 base::win::RegKey policy_key(HKEY_LOCAL_MACHINE, kPoliciesKey, 641 .WillOnce(Return(S_OK));
372 KEY_SET_VALUE);
373 ASSERT_EQ(ERROR_SUCCESS, policy_key.WriteValue(value_name.c_str(), policy));
374 } 642 }
375 643
376 static const base::char16 kPoliciesKey[]; 644 // Prepares the IGoogleUpdate3 simulator to process an upgrade.
377 static const base::char16 kUpdateDefault[]; 645 void PrepareSimulatorForUpgrade(const base::char16* app_guid) {
646 PrepareSimulatorForUpdateCheck(app_guid);
647 // Expect the bundle to be called on to start the install.
648 EXPECT_CALL(*mock_app_bundle_, install())
649 .WillOnce(Return(S_OK));
650 }
651
652 // Adds a MockCurrentState to the back of the sequence to be returned by the
653 // mock IApp.
654 void PushState(CurrentState state) {
655 MakeNextState(state);
656 }
657
658 // Adds a MockCurrentState to the back of the sequence to be returned by the
659 // mock IApp for an ERROR state.
660 void PushErrorState(LONG error_code,
661 const base::string16& completion_message,
662 LONG installer_result_code) {
663 CComObject<MockCurrentState>* mock_state = MakeNextState(STATE_ERROR);
664 EXPECT_CALL(*mock_state, get_errorCode(_))
665 .WillRepeatedly(DoAll(SetArgPointee<0>(error_code), Return(S_OK)));
666 mock_state->ExpectCompletionMessage(completion_message);
667 if (installer_result_code != -1) {
668 EXPECT_CALL(*mock_state, get_installerResultCode(_))
669 .WillRepeatedly(DoAll(SetArgPointee<0>(installer_result_code),
670 Return(S_OK)));
671 }
672 }
673
674 // Adds a MockCurrentState to the back of the sequence to be returned by the
675 // mock IApp for an UPDATE_AVAILABLE state.
676 void PushUpdateAvailableState(const base::string16& new_version) {
677 MakeNextState(STATE_UPDATE_AVAILABLE)->ExpectAvailableVersion(new_version);
678 }
679
680 // Adds a MockCurrentState to the back of the sequence to be returned by the
681 // mock IApp for a DOWNLOADING or INSTALLING state.
682 void PushProgressiveState(CurrentState state, int progress) {
683 CComObject<MockCurrentState>* mock_state = MakeNextState(state);
684 if (state == STATE_DOWNLOADING) {
685 const ULONG kTotalBytes = 1024;
686 ULONG bytes_down = static_cast<double>(kTotalBytes) * progress / 100.0;
687 EXPECT_CALL(*mock_state, get_totalBytesToDownload(_))
688 .WillRepeatedly(DoAll(SetArgPointee<0>(kTotalBytes), Return(S_OK)));
689 EXPECT_CALL(*mock_state, get_bytesDownloaded(_))
690 .WillRepeatedly(DoAll(SetArgPointee<0>(bytes_down), Return(S_OK)));
691 } else if (state == STATE_INSTALLING) {
692 EXPECT_CALL(*mock_state, get_installProgress(_))
693 .WillRepeatedly(DoAll(SetArgPointee<0>(progress), Return(S_OK)));
694 } else {
695 ADD_FAILURE() << "unsupported state " << state;
696 }
697 }
698
378 static const base::char16 kClients[]; 699 static const base::char16 kClients[];
379 static const base::char16 kClientState[]; 700 static const base::char16 kClientState[];
380 static const base::char16 kChromeGuid[]; 701 static const base::char16 kChromeGuid[];
381 static const base::char16 kChromeBinariesGuid[]; 702 static const base::char16 kChromeBinariesGuid[];
382 703
383 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 704 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
384 base::ThreadTaskRunnerHandle task_runner_handle_; 705 base::ThreadTaskRunnerHandle task_runner_handle_;
385 bool system_level_; 706 bool system_level_;
386 scoped_ptr<base::ScopedPathOverride> file_exe_override_; 707 scoped_ptr<base::ScopedPathOverride> file_exe_override_;
387 scoped_ptr<base::ScopedPathOverride> program_files_override_; 708 scoped_ptr<base::ScopedPathOverride> program_files_override_;
388 scoped_ptr<base::ScopedPathOverride> program_files_x86_override_; 709 scoped_ptr<base::ScopedPathOverride> program_files_x86_override_;
389 scoped_ptr<base::ScopedPathOverride> local_app_data_override_; 710 scoped_ptr<base::ScopedPathOverride> local_app_data_override_;
390 registry_util::RegistryOverrideManager registry_override_manager_; 711 registry_util::RegistryOverrideManager registry_override_manager_;
391 MockUpdateCheckCallbackReceiver callback_receiver_; 712
392 MockGoogleUpdateFactory mock_google_update_factory_; 713 // A mock object, the OnUpdateCheckCallback method of which will be invoked
393 CComObject<MockOnDemand>* mock_on_demand_; 714 // each time the update check machinery invokes the given UpdateCheckCallback.
394 base::win::ScopedComPtr<IGoogleUpdate> on_demand_holder_; 715 StrictMock<MockUpdateCheckDelegate> mock_update_check_delegate_;
716
717 // A mock object that provides a GoogleUpdate3ClassFactory by which the test
718 // fixture's IGoogleUpdate3 simulator is provided to the update check
719 // machinery.
720 StrictMock<MockGoogleUpdateFactory> mock_google_update_factory_;
721
722 // The mock objects that simulate the IGoogleUpdate3 API.
723 CComObject<MockApp>* mock_app_;
724 CComObject<MockAppBundle>* mock_app_bundle_;
725
726 // A gmock sequence under which expectations on the MockApp are evaluated.
727 Sequence state_sequence_;
728
729 // The states returned by the MockApp when probed.
730 std::queue<CComObject<MockCurrentState>*> states_;
731
732 // The new version that the fixture will pretend is available.
395 base::string16 new_version_; 733 base::string16 new_version_;
396 734
735 private:
736 // Returns a new MockCurrentState that will be returned by the mock IApp's
737 // get_currentState method.
738 CComObject<MockCurrentState>* MakeNextState(CurrentState state) {
739 CComObject<MockCurrentState>* mock_state = nullptr;
740 // The new object's refcount is held at zero until it is released from the
741 // simulator in GetNextState.
742 EXPECT_EQ(S_OK, CComObject<MockCurrentState>::CreateInstance(&mock_state));
743 EXPECT_CALL(*mock_state, get_stateValue(_))
744 .WillRepeatedly(DoAll(SetArgPointee<0>(state), Return(S_OK)));
745 states_.push(mock_state);
746 // Tell the app to expect this state.
747 EXPECT_CALL(*mock_app_, get_currentState(_))
748 .InSequence(state_sequence_);
749 return mock_state;
750 }
751
752 // An implementation of IApp::get_currentState that advances the
753 // IGoogleUpdate3 simulator through a series of states.
754 HRESULT GetNextState(IDispatch** current_state) {
755 EXPECT_FALSE(states_.empty());
756 *current_state = states_.front();
757 // Give a reference to the caller.
758 (*current_state)->AddRef();
759 states_.pop();
760 return S_OK;
761 }
762
397 DISALLOW_COPY_AND_ASSIGN(GoogleUpdateWinTest); 763 DISALLOW_COPY_AND_ASSIGN(GoogleUpdateWinTest);
398 }; 764 };
399 765
400 // static 766 // static
401 const base::char16 GoogleUpdateWinTest::kPoliciesKey[] =
402 L"SOFTWARE\\Policies\\Google\\Update";
403 const base::char16 GoogleUpdateWinTest::kUpdateDefault[] = L"UpdateDefault";
404 const base::char16 GoogleUpdateWinTest::kClients[] = 767 const base::char16 GoogleUpdateWinTest::kClients[] =
405 L"Software\\Google\\Update\\Clients"; 768 L"Software\\Google\\Update\\Clients";
406 const base::char16 GoogleUpdateWinTest::kClientState[] = 769 const base::char16 GoogleUpdateWinTest::kClientState[] =
407 L"Software\\Google\\Update\\ClientState"; 770 L"Software\\Google\\Update\\ClientState";
408 const base::char16 GoogleUpdateWinTest::kChromeGuid[] = 771 const base::char16 GoogleUpdateWinTest::kChromeGuid[] =
409 L"{8A69D345-D564-463c-AFF1-A69D9E530F96}"; 772 L"{8A69D345-D564-463c-AFF1-A69D9E530F96}";
410 const base::char16 GoogleUpdateWinTest::kChromeBinariesGuid[] = 773 const base::char16 GoogleUpdateWinTest::kChromeBinariesGuid[] =
411 L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}"; 774 L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}";
412 775
413 // Test that an update check fails with the proper error code if Chrome isn't in 776 // Test that an update check fails with the proper error code if Chrome isn't in
414 // one of the expected install directories. 777 // one of the expected install directories.
415 TEST_P(GoogleUpdateWinTest, InvalidInstallDirectory) { 778 TEST_P(GoogleUpdateWinTest, InvalidInstallDirectory) {
416 // Override FILE_EXE so that it looks like the test is running from a 779 // Override FILE_EXE so that it looks like the test is running from a
417 // non-standard location. 780 // non-standard location.
418 base::FilePath file_exe; 781 base::FilePath file_exe;
419 base::FilePath dir_temp; 782 base::FilePath dir_temp;
420 ASSERT_TRUE(PathService::Get(base::FILE_EXE, &file_exe)); 783 ASSERT_TRUE(PathService::Get(base::FILE_EXE, &file_exe));
421 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &dir_temp)); 784 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &dir_temp));
422 file_exe_override_.reset(); 785 file_exe_override_.reset();
423 file_exe_override_.reset(new base::ScopedPathOverride( 786 file_exe_override_.reset(new base::ScopedPathOverride(
424 base::FILE_EXE, dir_temp.Append(file_exe.BaseName()), 787 base::FILE_EXE, dir_temp.Append(file_exe.BaseName()),
425 true /* is_absolute */, false /* create */)); 788 true /* is_absolute */, false /* create */));
426 789
427 EXPECT_CALL( 790 EXPECT_CALL(mock_update_check_delegate_,
428 callback_receiver_, 791 OnError(CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY, _, _));
429 OnUpdateCheckCallback(UPGRADE_ERROR, 792 BeginUpdateCheck(task_runner_, std::string(), false, 0,
430 CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY, _, _)); 793 mock_update_check_delegate_.AsWeakPtr());
431 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
432 task_runner_->RunUntilIdle(); 794 task_runner_->RunUntilIdle();
433 } 795 }
434 796
435 #if defined(GOOGLE_CHROME_BUILD) 797 #if defined(GOOGLE_CHROME_BUILD)
436 798
437 TEST_P(GoogleUpdateWinTest, AllUpdatesDisabledByPolicy) { 799 // Test the case where the GoogleUpdate class can't be created for an update
438 // Disable updates altogether. 800 // check.
439 SetDefaultUpdatePolicy(GoogleUpdateSettings::UPDATES_DISABLED);
440
441 EXPECT_CALL(callback_receiver_,
442 OnUpdateCheckCallback(UPGRADE_ERROR,
443 GOOGLE_UPDATE_DISABLED_BY_POLICY, _, _));
444 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
445 task_runner_->RunUntilIdle();
446 }
447
448 TEST_P(GoogleUpdateWinTest, MultiUpdatesDisabledByPolicy) {
449 // Disable updates altogether.
450 SetAppUpdatePolicy(kChromeBinariesGuid,
451 GoogleUpdateSettings::UPDATES_DISABLED);
452
453 EXPECT_CALL(callback_receiver_,
454 OnUpdateCheckCallback(UPGRADE_ERROR,
455 GOOGLE_UPDATE_DISABLED_BY_POLICY, _, _));
456 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
457 task_runner_->RunUntilIdle();
458 }
459
460 TEST_P(GoogleUpdateWinTest, AllManualUpdatesDisabledByPolicy) {
461 // Disable updates altogether.
462 SetDefaultUpdatePolicy(GoogleUpdateSettings::AUTO_UPDATES_ONLY);
463
464 EXPECT_CALL(
465 callback_receiver_,
466 OnUpdateCheckCallback(UPGRADE_ERROR,
467 GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY, _, _));
468 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
469 task_runner_->RunUntilIdle();
470 }
471
472 TEST_P(GoogleUpdateWinTest, MultiManualUpdatesDisabledByPolicy) {
473 // Disable updates altogether.
474 SetAppUpdatePolicy(kChromeBinariesGuid,
475 GoogleUpdateSettings::AUTO_UPDATES_ONLY);
476
477 EXPECT_CALL(
478 callback_receiver_,
479 OnUpdateCheckCallback(UPGRADE_ERROR,
480 GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY, _, _));
481 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
482 task_runner_->RunUntilIdle();
483 }
484
485 TEST_P(GoogleUpdateWinTest, NoGoogleUpdateForCheck) { 801 TEST_P(GoogleUpdateWinTest, NoGoogleUpdateForCheck) {
486 // The factory should be called upon: let it fail. 802 // The factory should be called upon: let it fail.
487 EXPECT_CALL(mock_google_update_factory_, Create(_)); 803 EXPECT_CALL(mock_google_update_factory_, Create(_));
488 804
489 // Expect the appropriate error when the on-demand class cannot be created. 805 // Expect the appropriate error when the on-demand class cannot be created.
490 EXPECT_CALL(callback_receiver_, 806 EXPECT_CALL(mock_update_check_delegate_,
491 OnUpdateCheckCallback( 807 OnError(GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _));
492 UPGRADE_ERROR, GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _)); 808 BeginUpdateCheck(task_runner_, std::string(), false, 0,
493 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback()); 809 mock_update_check_delegate_.AsWeakPtr());
494 task_runner_->RunUntilIdle(); 810 task_runner_->RunUntilIdle();
495 } 811 }
496 812
813 // Test the case where the GoogleUpdate class can't be created for an upgrade.
497 TEST_P(GoogleUpdateWinTest, NoGoogleUpdateForUpgrade) { 814 TEST_P(GoogleUpdateWinTest, NoGoogleUpdateForUpgrade) {
498 // The factory should be called upon: let it fail. 815 // The factory should be called upon: let it fail.
499 EXPECT_CALL(mock_google_update_factory_, Create(_)); 816 EXPECT_CALL(mock_google_update_factory_, Create(_));
500 817
501 // Expect the appropriate error when the on-demand class cannot be created. 818 // Expect the appropriate error when the on-demand class cannot be created.
502 EXPECT_CALL(callback_receiver_, 819 EXPECT_CALL(mock_update_check_delegate_,
503 OnUpdateCheckCallback( 820 OnError(GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _));
504 UPGRADE_ERROR, GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _)); 821 BeginUpdateCheck(task_runner_, std::string(), true, 0,
505 BeginUpdateCheck(task_runner_, true, 0, callback_receiver_.GetCallback()); 822 mock_update_check_delegate_.AsWeakPtr());
506 task_runner_->RunUntilIdle(); 823 task_runner_->RunUntilIdle();
507 } 824 }
508 825
826 // Test the case where the GoogleUpdate class returns an error when an update
827 // check is started.
509 TEST_P(GoogleUpdateWinTest, FailUpdateCheck) { 828 TEST_P(GoogleUpdateWinTest, FailUpdateCheck) {
510 // The factory should be called upon: let it return the mock on-demand class. 829 // The factory should be called upon: let it return the mock on-demand class.
511 EXPECT_CALL(mock_google_update_factory_, Create(_)) 830 PrepareSimulator(kChromeBinariesGuid);
512 .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK))); 831 // checkForUpdate will fail.
513 // The mock on-demand class should be called. 832 EXPECT_CALL(*mock_app_bundle_, checkForUpdate())
514 EXPECT_CALL(*mock_on_demand_, CheckForUpdate(StrEq(kChromeBinariesGuid), _)); 833 .WillOnce(Return(E_FAIL));
515 834
516 EXPECT_CALL( 835 EXPECT_CALL(mock_update_check_delegate_,
517 callback_receiver_, 836 OnError(GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR, _, _));
518 OnUpdateCheckCallback(UPGRADE_ERROR, 837 BeginUpdateCheck(task_runner_, std::string(), false, 0,
519 GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR, _, _)); 838 mock_update_check_delegate_.AsWeakPtr());
520 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
521 task_runner_->RunUntilIdle(); 839 task_runner_->RunUntilIdle();
522 } 840 }
523 841
524 TEST_P(GoogleUpdateWinTest, UpdateCheckNoUpdate) { 842 // Test the case where the GoogleUpdate class reports that updates are disabled
525 EXPECT_CALL(mock_google_update_factory_, Create(_)) 843 // by Group Policy via E_APP_UPDATE_DISABLED_BY_POLICY (0x80040813).
Peter Kasting 2015/05/09 02:19:02 Nit: These comments are clearer than the old comme
grt (UTC plus 2) 2015/05/12 20:21:52 Done.
526 .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK))); 844 TEST_P(GoogleUpdateWinTest, UpdatesDisabledByPolicy) {
527 mock_on_demand_->OnCheckRunUpToDateSequence(kChromeBinariesGuid); 845 PrepareSimulatorForUpdateCheck(kChromeBinariesGuid);
846 PushState(STATE_INIT);
847 PushState(STATE_CHECKING_FOR_UPDATE);
848 PushErrorState(0x80040813, L"disabled by policy", -1);
528 849
529 EXPECT_CALL(callback_receiver_, 850 EXPECT_CALL(mock_update_check_delegate_,
530 OnUpdateCheckCallback(UPGRADE_ALREADY_UP_TO_DATE, 851 OnError(GOOGLE_UPDATE_DISABLED_BY_POLICY, _, _));
531 GOOGLE_UPDATE_NO_ERROR, IsEmpty(), _)); 852 BeginUpdateCheck(task_runner_, std::string(), false, 0,
532 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback()); 853 mock_update_check_delegate_.AsWeakPtr());
533 task_runner_->RunUntilIdle(); 854 task_runner_->RunUntilIdle();
534 } 855 }
535 856
536 TEST_P(GoogleUpdateWinTest, UpdateCheckUpdateAvailable) { 857 // Test an update check where no update is available.
537 EXPECT_CALL(mock_google_update_factory_, Create(_)) 858 TEST_P(GoogleUpdateWinTest, UpdateCheckNoUpdate) {
538 .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK))); 859 PrepareSimulatorForUpdateCheck(kChromeBinariesGuid);
539 mock_on_demand_->OnCheckRunUpdateAvailableSequence(kChromeBinariesGuid, 860 PushState(STATE_INIT);
540 new_version_); 861 PushState(STATE_CHECKING_FOR_UPDATE);
862 PushState(STATE_NO_UPDATE);
541 863
542 EXPECT_CALL( 864 EXPECT_CALL(mock_update_check_delegate_,
543 callback_receiver_, 865 OnUpdateCheckComplete(IsEmpty())); // new_version
544 OnUpdateCheckCallback(UPGRADE_IS_AVAILABLE, GOOGLE_UPDATE_NO_ERROR, 866 BeginUpdateCheck(task_runner_, std::string(), false, 0,
545 IsEmpty(), StrEq(new_version_))); 867 mock_update_check_delegate_.AsWeakPtr());
546 BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
547 task_runner_->RunUntilIdle(); 868 task_runner_->RunUntilIdle();
548 } 869 }
549 870
550 TEST_P(GoogleUpdateWinTest, UpdateInstalled) { 871 // Test an update check where an update is available.
551 EXPECT_CALL(mock_google_update_factory_, Create(_)) 872 TEST_P(GoogleUpdateWinTest, UpdateCheckUpdateAvailable) {
552 .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK))); 873 PrepareSimulatorForUpdateCheck(kChromeBinariesGuid);
553 mock_on_demand_->OnUpdateRunInstallUpdateSequence(kChromeBinariesGuid, 874 PushState(STATE_INIT);
554 new_version_); 875 PushState(STATE_CHECKING_FOR_UPDATE);
876 PushUpdateAvailableState(new_version_);
555 877
556 EXPECT_CALL(callback_receiver_, 878 EXPECT_CALL(mock_update_check_delegate_,
557 OnUpdateCheckCallback(UPGRADE_SUCCESSFUL, GOOGLE_UPDATE_NO_ERROR, 879 OnUpdateCheckComplete(StrEq(new_version_)));
558 IsEmpty(), StrEq(new_version_))); 880 BeginUpdateCheck(task_runner_, std::string(), false, 0,
559 BeginUpdateCheck(task_runner_, true, 0, callback_receiver_.GetCallback()); 881 mock_update_check_delegate_.AsWeakPtr());
560 task_runner_->RunUntilIdle(); 882 task_runner_->RunUntilIdle();
561 } 883 }
562 884
563 TEST_P(GoogleUpdateWinTest, UpdateFailed) { 885 // Test a successful upgrade.
564 static const base::char16 kError[] = L"It didn't work."; 886 TEST_P(GoogleUpdateWinTest, UpdateInstalled) {
565 EXPECT_CALL(mock_google_update_factory_, Create(_)) 887 PrepareSimulatorForUpgrade(kChromeBinariesGuid);
566 .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK))); 888 PushState(STATE_INIT);
567 mock_on_demand_->OnUpdateRunUpdateErrorSequence(kChromeBinariesGuid, kError); 889 PushState(STATE_CHECKING_FOR_UPDATE);
890 PushUpdateAvailableState(new_version_);
891 PushState(STATE_WAITING_TO_DOWNLOAD);
892 PushProgressiveState(STATE_DOWNLOADING, 0);
893 PushProgressiveState(STATE_DOWNLOADING, 25);
894 PushProgressiveState(STATE_DOWNLOADING, 25);
895 PushProgressiveState(STATE_DOWNLOADING, 75);
896 PushState(STATE_WAITING_TO_INSTALL);
897 PushProgressiveState(STATE_INSTALLING, 50);
898 PushState(STATE_INSTALL_COMPLETE);
568 899
569 EXPECT_CALL(callback_receiver_, 900 {
570 OnUpdateCheckCallback(UPGRADE_ERROR, GOOGLE_UPDATE_ERROR_UPDATING, 901 InSequence callback_sequence;
571 StrEq(kError), IsEmpty())); 902 EXPECT_CALL(mock_update_check_delegate_,
572 BeginUpdateCheck(task_runner_, true, 0, callback_receiver_.GetCallback()); 903 OnUpgradeProgress(0, StrEq(new_version_)));
904 EXPECT_CALL(mock_update_check_delegate_,
905 OnUpgradeProgress(12, StrEq(new_version_)));
906 EXPECT_CALL(mock_update_check_delegate_,
907 OnUpgradeProgress(37, StrEq(new_version_)));
908 EXPECT_CALL(mock_update_check_delegate_,
909 OnUpgradeProgress(50, StrEq(new_version_)));
910 EXPECT_CALL(mock_update_check_delegate_,
911 OnUpgradeProgress(75, StrEq(new_version_)));
912 EXPECT_CALL(mock_update_check_delegate_,
913 OnUpgradeComplete(StrEq(new_version_)));
914 }
915 BeginUpdateCheck(task_runner_, std::string(), true, 0,
916 mock_update_check_delegate_.AsWeakPtr());
573 task_runner_->RunUntilIdle(); 917 task_runner_->RunUntilIdle();
574 } 918 }
575 919
920 // Test a failed upgrade where Google Update reports that the installer failed
921 // (0x80040902 == E_INSTALLER_FAILED).
922 TEST_P(GoogleUpdateWinTest, UpdateFailed) {
923 const base::string16 error(L"It didn't work.");
924 static const int kInstallerError = 12;
925
926 PrepareSimulatorForUpgrade(kChromeBinariesGuid);
927 PushState(STATE_INIT);
928 PushState(STATE_CHECKING_FOR_UPDATE);
929 PushUpdateAvailableState(new_version_);
930 PushState(STATE_WAITING_TO_DOWNLOAD);
931 PushProgressiveState(STATE_DOWNLOADING, 0);
932 PushProgressiveState(STATE_DOWNLOADING, 25);
933 PushProgressiveState(STATE_DOWNLOADING, 25);
934 PushProgressiveState(STATE_DOWNLOADING, 75);
935 PushState(STATE_WAITING_TO_INSTALL);
936 PushProgressiveState(STATE_INSTALLING, 50);
937 PushErrorState(0x80040902, error, kInstallerError);
938
939 {
940 InSequence callback_sequence;
941 EXPECT_CALL(mock_update_check_delegate_,
942 OnUpgradeProgress(0, StrEq(new_version_)));
943 EXPECT_CALL(mock_update_check_delegate_,
944 OnUpgradeProgress(12, StrEq(new_version_)));
945 EXPECT_CALL(mock_update_check_delegate_,
946 OnUpgradeProgress(37, StrEq(new_version_)));
947 EXPECT_CALL(mock_update_check_delegate_,
948 OnUpgradeProgress(50, StrEq(new_version_)));
949 EXPECT_CALL(mock_update_check_delegate_,
950 OnUpgradeProgress(75, StrEq(new_version_)));
951 EXPECT_CALL(mock_update_check_delegate_,
952 OnError(GOOGLE_UPDATE_ERROR_UPDATING, HasSubstr(error),
953 StrEq(new_version_)));
954 }
955 BeginUpdateCheck(task_runner_, std::string(), true, 0,
956 mock_update_check_delegate_.AsWeakPtr());
957 task_runner_->RunUntilIdle();
958 }
959
576 #endif // defined(GOOGLE_CHROME_BUILD) 960 #endif // defined(GOOGLE_CHROME_BUILD)
577 961
578 INSTANTIATE_TEST_CASE_P(UserLevel, GoogleUpdateWinTest, Values(false)); 962 INSTANTIATE_TEST_CASE_P(UserLevel, GoogleUpdateWinTest, Values(false));
579 963
580 INSTANTIATE_TEST_CASE_P(SystemLevel, GoogleUpdateWinTest, Values(true)); 964 INSTANTIATE_TEST_CASE_P(SystemLevel, GoogleUpdateWinTest, Values(true));
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698