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