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