OLD | NEW |
---|---|
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 Loading... | |
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)); |
OLD | NEW |