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

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

Powered by Google App Engine
This is Rietveld 408576698