Chromium Code Reviews| 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 |