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

Unified Diff: chrome/browser/google/google_update_win_unittest.cc

Issue 1117263002: Switch on-demand update checks to the less-old GoogleUpdate3 API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sync to position 329622 Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/google/google_update_win_unittest.cc
diff --git a/chrome/browser/google/google_update_win_unittest.cc b/chrome/browser/google/google_update_win_unittest.cc
index 97498e4b03e2b81fd87f3b732953d65a82833789..f6be4866b9cda6edf8931b3c8be2c937c3268248 100644
--- a/chrome/browser/google/google_update_win_unittest.cc
+++ b/chrome/browser/google/google_update_win_unittest.cc
@@ -13,7 +13,6 @@
#include "base/base_paths.h"
#include "base/memory/ref_counted.h"
#include "base/path_service.h"
-#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_path_override.h"
@@ -22,6 +21,7 @@
#include "base/thread_task_runner_handle.h"
#include "base/version.h"
#include "base/win/registry.h"
+#include "base/win/scoped_comptr.h"
#include "chrome/installer/util/browser_distribution.h"
#include "chrome/installer/util/google_update_settings.h"
#include "chrome/installer/util/helper.h"
@@ -31,253 +31,364 @@
#include "ui/base/win/atl_module.h"
#include "version.h"
+using ::testing::Assign;
using ::testing::DoAll;
+using ::testing::DoubleEq;
+using ::testing::HasSubstr;
+using ::testing::InSequence;
using ::testing::Invoke;
using ::testing::IsEmpty;
using ::testing::Return;
+using ::testing::Sequence;
using ::testing::SetArgPointee;
using ::testing::StrEq;
-using ::testing::Unused;
+using ::testing::StrictMock;
using ::testing::Values;
using ::testing::_;
namespace {
-class UpdateCheckCallbackReceiver {
+class MockUpdateCheckDelegate : public UpdateCheckDelegate {
public:
- UpdateCheckCallbackReceiver() {}
- virtual ~UpdateCheckCallbackReceiver() {}
- virtual void OnUpdateCheckCallback(GoogleUpdateUpgradeResult result,
- GoogleUpdateErrorCode error_code,
- const base::string16& error_message,
- const base::string16& version) = 0;
- UpdateCheckCallback GetCallback() {
- return base::Bind(&UpdateCheckCallbackReceiver::UpdateCheckCallback,
- base::Unretained(this));
- }
+ MockUpdateCheckDelegate() : weak_ptr_factory_(this) {}
- private:
- void UpdateCheckCallback(GoogleUpdateUpgradeResult result,
- GoogleUpdateErrorCode error_code,
- const base::string16& error_message,
- const base::string16& version) {
- OnUpdateCheckCallback(result, error_code, error_message, version);
+ base::WeakPtr<UpdateCheckDelegate> AsWeakPtr() {
+ return weak_ptr_factory_.GetWeakPtr();
}
- DISALLOW_COPY_AND_ASSIGN(UpdateCheckCallbackReceiver);
-};
-
-class MockUpdateCheckCallbackReceiver : public UpdateCheckCallbackReceiver {
- public:
- MockUpdateCheckCallbackReceiver() {}
- MOCK_METHOD4(OnUpdateCheckCallback,
- void(GoogleUpdateUpgradeResult,
- GoogleUpdateErrorCode,
- const base::string16&,
- const base::string16&));
+ MOCK_METHOD1(OnUpdateCheckComplete, void(const base::string16&));
+ MOCK_METHOD2(OnUpgradeProgress, void(int, const base::string16&));
+ MOCK_METHOD1(OnUpgradeComplete, void(const base::string16&));
+ MOCK_METHOD3(OnError, void(GoogleUpdateErrorCode,
+ const base::string16&,
+ const base::string16&));
private:
- DISALLOW_COPY_AND_ASSIGN(MockUpdateCheckCallbackReceiver);
+ base::WeakPtrFactory<UpdateCheckDelegate> weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockUpdateCheckDelegate);
};
+// An interface that exposes a factory method for creating an IGoogleUpdate3Web
+// instance.
class GoogleUpdateFactory {
public:
virtual ~GoogleUpdateFactory() {}
- virtual HRESULT Create(base::win::ScopedComPtr<IGoogleUpdate>* on_demand) = 0;
+ virtual HRESULT Create(
+ base::win::ScopedComPtr<IGoogleUpdate3Web>* google_update) = 0;
};
+// A mock factory for creating an IGoogleUpdate3Web instance.
class MockGoogleUpdateFactory : public GoogleUpdateFactory {
public:
MockGoogleUpdateFactory() {}
- MOCK_METHOD1(Create, HRESULT(base::win::ScopedComPtr<IGoogleUpdate>*));
+ MOCK_METHOD1(Create, HRESULT(base::win::ScopedComPtr<IGoogleUpdate3Web>*));
private:
DISALLOW_COPY_AND_ASSIGN(MockGoogleUpdateFactory);
};
-// A mock IGoogleUpdate on-demand update class that can run an IJobObserver
-// through a set of states.
-class MockOnDemand : public CComObjectRootEx<CComSingleThreadModel>,
- public IGoogleUpdate {
+class MockCurrentState : public CComObjectRootEx<CComSingleThreadModel>,
+ public ICurrentState {
public:
- BEGIN_COM_MAP(MockOnDemand)
- COM_INTERFACE_ENTRY(IGoogleUpdate)
+ BEGIN_COM_MAP(MockCurrentState)
+ COM_INTERFACE_ENTRY(ICurrentState)
END_COM_MAP()
- MockOnDemand() : task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
+ MockCurrentState() {}
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
- CheckForUpdate,
- HRESULT(const wchar_t*, IJobObserver*));
- MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
- Update,
- HRESULT(const wchar_t*, IJobObserver*));
-
- void OnCheckRunUpToDateSequence(const base::char16* app_guid) {
- EXPECT_CALL(*this, CheckForUpdate(StrEq(app_guid), _))
- .WillOnce(DoAll(Invoke(this, &MockOnDemand::BeginUpToDateSequence),
- Return(S_OK)));
+ // Adds an expectation for get_completionMessage that will return the given
+ // message any number of times.
+ void ExpectCompletionMessage(const base::string16& completion_message) {
+ completion_message_ = completion_message;
+ EXPECT_CALL(*this, get_completionMessage(_))
+ .WillRepeatedly(
+ ::testing::Invoke(this, &MockCurrentState::GetCompletionMessage));
}
- void OnCheckRunUpdateAvailableSequence(const base::char16* app_guid,
- const base::string16& new_version) {
- new_version_ = new_version;
- EXPECT_CALL(*this, CheckForUpdate(StrEq(app_guid), _))
- .WillOnce(
- DoAll(Invoke(this, &MockOnDemand::BeginUpdateAvailableSequence),
- Return(S_OK)));
+ HRESULT GetCompletionMessage(BSTR* completion_message) {
+ *completion_message = SysAllocString(completion_message_.c_str());
+ return S_OK;
}
- void OnUpdateRunInstallUpdateSequence(const base::char16* app_guid,
- const base::string16& new_version) {
- new_version_ = new_version;
- EXPECT_CALL(*this, Update(StrEq(app_guid), _))
- .WillOnce(DoAll(Invoke(this, &MockOnDemand::BeginInstallUpdateSequence),
- Return(S_OK)));
+ // Adds an expectation for get_availableVersion that will return the given
+ // version any number of times.
+ void ExpectAvailableVersion(const base::string16& available_version) {
+ available_version_ = available_version;
+ EXPECT_CALL(*this, get_availableVersion(_))
+ .WillRepeatedly(
+ ::testing::Invoke(this, &MockCurrentState::GetAvailableVersion));
}
- void OnUpdateRunUpdateErrorSequence(const base::char16* app_guid,
- const base::char16* error_text) {
- error_text_ = error_text;
- EXPECT_CALL(*this, Update(StrEq(app_guid), _))
- .WillOnce(DoAll(Invoke(this, &MockOnDemand::BeginUpdateErrorSequence),
- Return(S_OK)));
+ HRESULT GetAvailableVersion(BSTR* available_version) {
+ *available_version = SysAllocString(available_version_.c_str());
+ return S_OK;
}
- private:
- enum State {
- STATE_CHECKING,
- STATE_COMPLETE_SUCCESS,
- STATE_UPDATE_AVAILABLE,
- STATE_WAITING_TO_DOWNLOAD,
- STATE_DOWNLOADING_25,
- STATE_DOWNLOADING_100,
- STATE_WAITING_TO_INSTALL,
- STATE_INSTALLING,
- STATE_COMPLETE_ERROR,
- };
-
- void BeginUpToDateSequence(Unused, IJobObserver* job_observer_ptr) {
- job_observer_ = job_observer_ptr;
- states_.push(STATE_CHECKING);
- states_.push(STATE_COMPLETE_SUCCESS);
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this)));
- }
+ // ICurrentState:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_stateValue,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_availableVersion,
+ HRESULT(BSTR *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_bytesDownloaded,
+ HRESULT(ULONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_totalBytesToDownload,
+ HRESULT(ULONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_downloadTimeRemainingMs,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_nextRetryTime,
+ HRESULT(ULONGLONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_installProgress,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_installTimeRemainingMs,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_isCanceled,
+ HRESULT(VARIANT_BOOL *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_errorCode,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_extraCode1,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_completionMessage,
+ HRESULT(BSTR *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_installerResultCode,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_installerResultExtraCode1,
+ HRESULT(LONG *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_postInstallLaunchCommandLine,
+ HRESULT(BSTR *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_postInstallUrl,
+ HRESULT(BSTR *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_postInstallAction,
+ HRESULT(LONG *));
+
+ // IDispatch:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfoCount,
+ HRESULT(UINT *));
+ MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfo,
+ HRESULT(UINT, LCID, ITypeInfo **));
+ MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetIDsOfNames,
+ HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
+ MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ Invoke,
+ HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
+ VARIANT *, EXCEPINFO *, UINT *));
- void BeginUpdateAvailableSequence(Unused, IJobObserver* job_observer_ptr) {
- job_observer_ = job_observer_ptr;
- states_.push(STATE_CHECKING);
- states_.push(STATE_UPDATE_AVAILABLE);
- states_.push(STATE_COMPLETE_SUCCESS);
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this)));
- }
+ private:
+ base::string16 completion_message_;
+ base::string16 available_version_;
- void BeginInstallUpdateSequence(Unused, IJobObserver* job_observer_ptr) {
- job_observer_ = job_observer_ptr;
- states_.push(STATE_CHECKING);
- states_.push(STATE_UPDATE_AVAILABLE);
- states_.push(STATE_WAITING_TO_DOWNLOAD);
- states_.push(STATE_DOWNLOADING_25);
- states_.push(STATE_DOWNLOADING_100);
- states_.push(STATE_WAITING_TO_INSTALL);
- states_.push(STATE_INSTALLING);
- states_.push(STATE_COMPLETE_SUCCESS);
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this)));
- }
+ DISALLOW_COPY_AND_ASSIGN(MockCurrentState);
+};
- void BeginUpdateErrorSequence(Unused, IJobObserver* job_observer_ptr) {
- job_observer_ = job_observer_ptr;
- states_.push(STATE_CHECKING);
- states_.push(STATE_UPDATE_AVAILABLE);
- states_.push(STATE_WAITING_TO_DOWNLOAD);
- states_.push(STATE_DOWNLOADING_25);
- states_.push(STATE_DOWNLOADING_100);
- states_.push(STATE_WAITING_TO_INSTALL);
- states_.push(STATE_INSTALLING);
- states_.push(STATE_COMPLETE_ERROR);
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&MockOnDemand::Advance, base::Unretained(this)));
- }
+class MockApp : public CComObjectRootEx<CComSingleThreadModel>, public IAppWeb {
+ public:
+ BEGIN_COM_MAP(MockApp)
+ COM_INTERFACE_ENTRY(IAppWeb)
+ END_COM_MAP()
- // Advance to the next state. If this state is non-terminal, a task is posted
- // to advance to the next state a bit later.
- void Advance() {
- ASSERT_FALSE(states_.empty());
- switch (states_.front()) {
- case STATE_CHECKING:
- EXPECT_EQ(S_OK, job_observer_->OnCheckingForUpdate());
- break;
- case STATE_COMPLETE_SUCCESS:
- EXPECT_EQ(S_OK,
- job_observer_->OnComplete(COMPLETION_CODE_SUCCESS, nullptr));
- break;
- case STATE_UPDATE_AVAILABLE:
- EXPECT_EQ(S_OK, job_observer_->OnUpdateAvailable(new_version_.c_str()));
- break;
- case STATE_WAITING_TO_DOWNLOAD:
- EXPECT_EQ(S_OK, job_observer_->OnWaitingToDownload());
- break;
- case STATE_DOWNLOADING_25:
- EXPECT_EQ(S_OK, job_observer_->OnDownloading(47, 25));
- break;
- case STATE_DOWNLOADING_100:
- EXPECT_EQ(S_OK, job_observer_->OnDownloading(42, 100));
- break;
- case STATE_WAITING_TO_INSTALL:
- EXPECT_EQ(S_OK, job_observer_->OnWaitingToInstall());
- break;
- case STATE_INSTALLING:
- EXPECT_EQ(S_OK, job_observer_->OnInstalling());
- break;
- case STATE_COMPLETE_ERROR:
- EXPECT_EQ(S_OK, job_observer_->OnComplete(COMPLETION_CODE_ERROR,
- error_text_.c_str()));
- break;
- }
- states_.pop();
- if (states_.empty()) {
- // Drop the reference to the observer when the terminal state is reached.
- job_observer_ = nullptr;
- } else {
- task_runner_->PostTask(FROM_HERE, base::Bind(&MockOnDemand::Advance,
- base::Unretained(this)));
- }
- }
+ MockApp() {}
+
+ // IAppWeb:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_appId,
+ HRESULT(BSTR *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_currentVersionWeb,
+ HRESULT(IDispatch **));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_nextVersionWeb,
+ HRESULT(IDispatch **));
+ MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_command,
+ HRESULT(BSTR, IDispatch **));
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ cancel,
+ HRESULT());
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_currentState,
+ HRESULT(IDispatch **));
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ launch,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ uninstall,
+ HRESULT());
+
+ // IDispatch:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfoCount,
+ HRESULT(UINT *));
+ MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfo,
+ HRESULT(UINT, LCID, ITypeInfo **));
+ MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetIDsOfNames,
+ HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
+ MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ Invoke,
+ HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
+ VARIANT *, EXCEPINFO *, UINT *));
- // The task runner on which the state machine runs.
- scoped_refptr<base::TaskRunner> task_runner_;
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockApp);
+};
- // The new version for a successful update check or update.
- base::string16 new_version_;
+class MockAppBundle : public CComObjectRootEx<CComSingleThreadModel>,
+ public IAppBundleWeb {
+ public:
+ BEGIN_COM_MAP(MockAppBundle)
+ COM_INTERFACE_ENTRY(IAppBundleWeb)
+ END_COM_MAP()
- // Error text to be supplied for an unsuccessful update check or update.
- base::string16 error_text_;
+ MockAppBundle() {}
+
+ // IAppBundleWeb:
+ MOCK_METHOD4_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ createApp,
+ HRESULT(BSTR, BSTR, BSTR, BSTR));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ createInstalledApp,
+ HRESULT(BSTR));
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ createAllInstalledApps,
+ HRESULT());
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_displayLanguage,
+ HRESULT(BSTR *));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ put_displayLanguage,
+ HRESULT(BSTR));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ put_parentHWND,
+ HRESULT(ULONG_PTR));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_length,
+ HRESULT(int *));
+ MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_appWeb,
+ HRESULT(int, IDispatch **));
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ initialize,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ checkForUpdate,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ download,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ install,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ pause,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ resume,
+ HRESULT());
+ MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ cancel,
+ HRESULT());
+ MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ downloadPackage,
+ HRESULT(BSTR, BSTR));
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ get_currentState,
+ HRESULT(VARIANT *));
+
+ // IDispatch:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfoCount,
+ HRESULT(UINT *));
+ MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfo,
+ HRESULT(UINT, LCID, ITypeInfo **));
+ MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetIDsOfNames,
+ HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
+ MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ Invoke,
+ HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
+ VARIANT *, EXCEPINFO *, UINT *));
- // The set of states to be run on an IJobObserver.
- std::queue<State> states_;
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockAppBundle);
+};
- // The IJobObserver given to either CheckForUpdate() or Update() that is being
- // driven through the desired state transitions.
- base::win::ScopedComPtr<IJobObserver> job_observer_;
+class MockGoogleUpdate : public CComObjectRootEx<CComSingleThreadModel>,
+ public IGoogleUpdate3Web {
+ public:
+ BEGIN_COM_MAP(MockGoogleUpdate)
+ COM_INTERFACE_ENTRY(IGoogleUpdate3Web)
+ END_COM_MAP()
- DISALLOW_COPY_AND_ASSIGN(MockOnDemand);
+ MockGoogleUpdate() {}
+
+ // IGoogleUpdate3Web:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ createAppBundleWeb,
+ HRESULT(IDispatch**));
+
+ // IDispatch:
+ MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfoCount,
+ HRESULT(UINT *));
+ MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetTypeInfo,
+ HRESULT(UINT, LCID, ITypeInfo **));
+ MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ GetIDsOfNames,
+ HRESULT(REFIID, LPOLESTR *, UINT, LCID, DISPID *));
+ MOCK_METHOD8_WITH_CALLTYPE(STDMETHODCALLTYPE,
+ Invoke,
+ HRESULT(DISPID, REFIID, LCID, WORD, DISPPARAMS *,
+ VARIANT *, EXCEPINFO *, UINT *));
+
+ DISALLOW_COPY_AND_ASSIGN(MockGoogleUpdate);
};
} // namespace
+// A test fixture that can simulate the IGoogleUpdate3Web API via Google Mock.
+// Individual tests must wire up the factories by a call to one of the
+// PrepareSimulator methods. The family of Push*State methods are then used to
+// configure the set of states to be simulated.
class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
public:
- static void SetUpTestCase() { ui::win::CreateATLModuleIfNeeded(); }
+ static void SetUpTestCase() {
+ ui::win::CreateATLModuleIfNeeded();
+ // Configure all mock functions that return HRESULT to return failure.
+ ::testing::DefaultValue<HRESULT>::Set(E_FAIL);
+ }
+
+ static void TearDownTestCase() { ::testing::DefaultValue<HRESULT>::Clear(); }
protected:
GoogleUpdateWinTest()
: task_runner_(new base::TestSimpleTaskRunner()),
task_runner_handle_(task_runner_),
- system_level_(GetParam()),
- mock_on_demand_(nullptr) {}
+ system_level_install_(GetParam()),
+ mock_app_(nullptr),
+ mock_app_bundle_(nullptr) {}
void SetUp() override {
::testing::TestWithParam<bool>::SetUp();
@@ -287,7 +398,7 @@ class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
base::FilePath file_exe;
ASSERT_TRUE(PathService::Get(base::FILE_EXE, &file_exe));
base::FilePath install_dir(installer::GetChromeInstallPath(
- system_level_, BrowserDistribution::GetDistribution()));
+ system_level_install_, BrowserDistribution::GetDistribution()));
file_exe_override_.reset(new base::ScopedPathOverride(
base::FILE_EXE, install_dir.Append(file_exe.BaseName()),
true /* is_absolute */, false /* create */));
@@ -310,7 +421,8 @@ class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
registry_override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE);
// Chrome is installed as multi-install.
- const HKEY root = system_level_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ const HKEY root =
+ system_level_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
base::win::RegKey key(root, kClients, KEY_WRITE | KEY_WOW64_32KEY);
ASSERT_EQ(ERROR_SUCCESS,
key.CreateKey(kChromeGuid, KEY_WRITE | KEY_WOW64_32KEY));
@@ -325,22 +437,11 @@ class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
key.WriteValue(L"UninstallArguments",
L"--uninstall --multi-install --chrome"));
- // Provide an IGoogleUpdate on-demand update class factory so that this test
- // can provide a mocked-out instance.
+ // Provide an IGoogleUpdate3Web class factory so that this test can provide
+ // a mocked-out instance.
SetGoogleUpdateFactoryForTesting(
base::Bind(&GoogleUpdateFactory::Create,
base::Unretained(&mock_google_update_factory_)));
- // Configure the factory to return a generic failure by default.
- ON_CALL(mock_google_update_factory_, Create(_))
- .WillByDefault(Return(E_FAIL));
-
- // Create a mock IGoogleUpdate on-demand update class
- ASSERT_EQ(S_OK, CComObject<MockOnDemand>::CreateInstance(&mock_on_demand_));
- on_demand_holder_ = mock_on_demand_;
- // Configure the mock to return a generic failure by default.
- ON_CALL(*mock_on_demand_, CheckForUpdate(_, _))
- .WillByDefault(Return(E_FAIL));
- ON_CALL(*mock_on_demand_, Update(_, _)).WillByDefault(Return(E_FAIL));
// Compute a newer version.
base::Version current_version(CHROME_VERSION_STRING);
@@ -352,29 +453,118 @@ class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
}
void TearDown() override {
+ ASSERT_EQ(nullptr, mock_app_);
+ ASSERT_EQ(nullptr, mock_app_bundle_);
+ ASSERT_TRUE(states_.empty());
// Remove the test's IGoogleUpdate on-demand update class factory.
- SetGoogleUpdateFactoryForTesting(OnDemandAppsClassFactory());
+ SetGoogleUpdateFactoryForTesting(GoogleUpdate3ClassFactory());
+ ::testing::TestWithParam<bool>::TearDown();
+ }
+
+ // Prepares the IGoogleUpdate3Web simulator.
+ void PrepareSimulator(const base::char16* app_guid) {
+ // Make the installed app and configure it to call the test fixture's
+ // GetNextState method.
+ ASSERT_EQ(S_OK, CComObject<MockApp>::CreateInstance(&mock_app_));
+ ON_CALL(*mock_app_, get_currentState(_))
+ .WillByDefault(Invoke(this, &GoogleUpdateWinTest::GetNextState));
+
+ // Make the app bundle containing the app.
+ ASSERT_EQ(S_OK,
+ CComObject<MockAppBundle>::CreateInstance(&mock_app_bundle_));
+ EXPECT_CALL(*mock_app_bundle_, initialize())
+ .WillOnce(Return(S_OK));
+ // The bundle will be called on to create the installed app.
+ EXPECT_CALL(*mock_app_bundle_, createInstalledApp(StrEq(app_guid)))
+ .WillOnce(Return(S_OK));
+ // Give mock_app_bundle a ref to the app which it will return when asked.
+ mock_app_->AddRef();
+ EXPECT_CALL(*mock_app_bundle_, get_appWeb(0, _))
+ .WillOnce(DoAll(SetArgPointee<1>(mock_app_),
+ Assign(&mock_app_, nullptr),
+ Return(S_OK)));
+
+ // Make the updater which will return the app bundle above.
+ CComObject<MockGoogleUpdate>* mock_google_update = nullptr;
+ ASSERT_EQ(S_OK, CComObject<MockGoogleUpdate>::CreateInstance(
+ &mock_google_update));
+ // Give mock_google_update a ref to the bundle which it will return when
+ // created.
+ mock_app_bundle_->AddRef();
+ EXPECT_CALL(*mock_google_update, createAppBundleWeb(_))
+ .WillOnce(DoAll(SetArgPointee<0>(mock_app_bundle_),
+ Assign(&mock_app_bundle_, nullptr),
+ Return(S_OK)));
+
+ // Give the factory this updater. Do not add a ref, as the factory will add
+ // one when it hands out its instance.
+ EXPECT_CALL(mock_google_update_factory_, Create(_))
+ .WillOnce(DoAll(SetArgPointee<0>(mock_google_update), Return(S_OK)));
+ }
+
+ // Prepares the IGoogleUpdate3Web simulator to process an update check.
+ void PrepareSimulatorForUpdateCheck(const base::char16* app_guid) {
+ PrepareSimulator(app_guid);
+ // Expect the bundle to be called on to start the update.
+ EXPECT_CALL(*mock_app_bundle_, checkForUpdate())
+ .WillOnce(Return(S_OK));
+ }
+
+ // Prepares the IGoogleUpdate3Web simulator to process an upgrade.
+ void PrepareSimulatorForUpgrade(const base::char16* app_guid) {
+ PrepareSimulatorForUpdateCheck(app_guid);
+ // Expect the bundle to be called on to start the install.
+ EXPECT_CALL(*mock_app_bundle_, install())
+ .WillOnce(Return(S_OK));
+ }
+
+ // Adds a MockCurrentState to the back of the sequence to be returned by the
+ // mock IAppWeb.
+ void PushState(CurrentState state) {
+ MakeNextState(state);
+ }
+
+ // Adds a MockCurrentState to the back of the sequence to be returned by the
+ // mock IAppWeb for an ERROR state.
+ void PushErrorState(LONG error_code,
+ const base::string16& completion_message,
+ LONG installer_result_code) {
+ CComObject<MockCurrentState>* mock_state = MakeNextState(STATE_ERROR);
+ EXPECT_CALL(*mock_state, get_errorCode(_))
+ .WillRepeatedly(DoAll(SetArgPointee<0>(error_code), Return(S_OK)));
+ mock_state->ExpectCompletionMessage(completion_message);
+ if (installer_result_code != -1) {
+ EXPECT_CALL(*mock_state, get_installerResultCode(_))
+ .WillRepeatedly(DoAll(SetArgPointee<0>(installer_result_code),
+ Return(S_OK)));
+ }
}
- // Set the default update policy in the registry.
- void SetDefaultUpdatePolicy(GoogleUpdateSettings::UpdatePolicy policy) const {
- base::win::RegKey policy_key(HKEY_LOCAL_MACHINE, kPoliciesKey,
- KEY_SET_VALUE);
- ASSERT_EQ(ERROR_SUCCESS, policy_key.WriteValue(kUpdateDefault, policy));
+ // Adds a MockCurrentState to the back of the sequence to be returned by the
+ // mock IAppWeb for an UPDATE_AVAILABLE state.
+ void PushUpdateAvailableState(const base::string16& new_version) {
+ MakeNextState(STATE_UPDATE_AVAILABLE)->ExpectAvailableVersion(new_version);
}
- // Stuffs |policy| in the registry for the app identified by |app_guid|.
- void SetAppUpdatePolicy(const base::char16* app_guid,
- GoogleUpdateSettings::UpdatePolicy policy) const {
- base::string16 value_name(L"Update");
- value_name += app_guid;
- base::win::RegKey policy_key(HKEY_LOCAL_MACHINE, kPoliciesKey,
- KEY_SET_VALUE);
- ASSERT_EQ(ERROR_SUCCESS, policy_key.WriteValue(value_name.c_str(), policy));
+ // Adds a MockCurrentState to the back of the sequence to be returned by the
+ // mock IAppWeb for a DOWNLOADING or INSTALLING state.
+ void PushProgressiveState(CurrentState state, int progress) {
+ CComObject<MockCurrentState>* mock_state = MakeNextState(state);
+ if (state == STATE_DOWNLOADING) {
+ const ULONG kTotalBytes = 1024;
+ ULONG bytes_down = static_cast<double>(kTotalBytes) * progress / 100.0;
+ EXPECT_CALL(*mock_state, get_totalBytesToDownload(_))
+ .WillRepeatedly(DoAll(SetArgPointee<0>(kTotalBytes), Return(S_OK)));
+ EXPECT_CALL(*mock_state, get_bytesDownloaded(_))
+ .WillRepeatedly(DoAll(SetArgPointee<0>(bytes_down), Return(S_OK)));
+ } else if (state == STATE_INSTALLING) {
+ EXPECT_CALL(*mock_state, get_installProgress(_))
+ .WillRepeatedly(DoAll(SetArgPointee<0>(progress), Return(S_OK)));
+ } else {
+ ADD_FAILURE() << "unsupported state " << state;
+ }
}
- static const base::char16 kPoliciesKey[];
- static const base::char16 kUpdateDefault[];
static const base::char16 kClients[];
static const base::char16 kClientState[];
static const base::char16 kChromeGuid[];
@@ -382,25 +572,67 @@ class GoogleUpdateWinTest : public ::testing::TestWithParam<bool> {
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
base::ThreadTaskRunnerHandle task_runner_handle_;
- bool system_level_;
+ bool system_level_install_;
scoped_ptr<base::ScopedPathOverride> file_exe_override_;
scoped_ptr<base::ScopedPathOverride> program_files_override_;
scoped_ptr<base::ScopedPathOverride> program_files_x86_override_;
scoped_ptr<base::ScopedPathOverride> local_app_data_override_;
registry_util::RegistryOverrideManager registry_override_manager_;
- MockUpdateCheckCallbackReceiver callback_receiver_;
- MockGoogleUpdateFactory mock_google_update_factory_;
- CComObject<MockOnDemand>* mock_on_demand_;
- base::win::ScopedComPtr<IGoogleUpdate> on_demand_holder_;
+
+ // A mock object, the OnUpdateCheckCallback method of which will be invoked
+ // each time the update check machinery invokes the given UpdateCheckCallback.
+ StrictMock<MockUpdateCheckDelegate> mock_update_check_delegate_;
+
+ // A mock object that provides a GoogleUpdate3ClassFactory by which the test
+ // fixture's IGoogleUpdate3Web simulator is provided to the update check
+ // machinery.
+ StrictMock<MockGoogleUpdateFactory> mock_google_update_factory_;
+
+ // The mock objects that simulate the IGoogleUpdate3Web API.
+ CComObject<MockApp>* mock_app_;
+ CComObject<MockAppBundle>* mock_app_bundle_;
+
+ // A gmock sequence under which expectations on the MockApp are evaluated.
+ Sequence state_sequence_;
+
+ // The states returned by the MockApp when probed.
+ std::queue<CComObject<MockCurrentState>*> states_;
+
+ // The new version that the fixture will pretend is available.
base::string16 new_version_;
+ private:
+ // Returns a new MockCurrentState that will be returned by the mock IAppWeb's
+ // get_currentState method.
+ CComObject<MockCurrentState>* MakeNextState(CurrentState state) {
+ CComObject<MockCurrentState>* mock_state = nullptr;
+ // The new object's refcount is held at zero until it is released from the
+ // simulator in GetNextState.
+ EXPECT_EQ(S_OK, CComObject<MockCurrentState>::CreateInstance(&mock_state));
+ EXPECT_CALL(*mock_state, get_stateValue(_))
+ .WillRepeatedly(DoAll(SetArgPointee<0>(state), Return(S_OK)));
+ states_.push(mock_state);
+ // Tell the app to expect this state.
+ EXPECT_CALL(*mock_app_, get_currentState(_))
+ .InSequence(state_sequence_);
+ return mock_state;
+ }
+
+ // An implementation of IAppWeb::get_currentState that advances the
+ // IGoogleUpdate3Web simulator through a series of states.
+ HRESULT GetNextState(IDispatch** current_state) {
+ EXPECT_FALSE(states_.empty());
+ *current_state = states_.front();
+ // Give a reference to the caller.
+ (*current_state)->AddRef();
+ states_.pop();
+ return S_OK;
+ }
+
DISALLOW_COPY_AND_ASSIGN(GoogleUpdateWinTest);
};
// static
-const base::char16 GoogleUpdateWinTest::kPoliciesKey[] =
- L"SOFTWARE\\Policies\\Google\\Update";
-const base::char16 GoogleUpdateWinTest::kUpdateDefault[] = L"UpdateDefault";
const base::char16 GoogleUpdateWinTest::kClients[] =
L"Software\\Google\\Update\\Clients";
const base::char16 GoogleUpdateWinTest::kClientState[] =
@@ -424,152 +656,175 @@ TEST_P(GoogleUpdateWinTest, InvalidInstallDirectory) {
base::FILE_EXE, dir_temp.Append(file_exe.BaseName()),
true /* is_absolute */, false /* create */));
- EXPECT_CALL(
- callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR,
- CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnError(CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY, _, _));
+ BeginUpdateCheck(task_runner_, std::string(), false, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
#if defined(GOOGLE_CHROME_BUILD)
-TEST_P(GoogleUpdateWinTest, AllUpdatesDisabledByPolicy) {
- // Disable updates altogether.
- SetDefaultUpdatePolicy(GoogleUpdateSettings::UPDATES_DISABLED);
-
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR,
- GOOGLE_UPDATE_DISABLED_BY_POLICY, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
- task_runner_->RunUntilIdle();
-}
-
-TEST_P(GoogleUpdateWinTest, MultiUpdatesDisabledByPolicy) {
- // Disable updates altogether.
- SetAppUpdatePolicy(kChromeBinariesGuid,
- GoogleUpdateSettings::UPDATES_DISABLED);
-
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR,
- GOOGLE_UPDATE_DISABLED_BY_POLICY, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
- task_runner_->RunUntilIdle();
-}
-
-TEST_P(GoogleUpdateWinTest, AllManualUpdatesDisabledByPolicy) {
- // Disable updates altogether.
- SetDefaultUpdatePolicy(GoogleUpdateSettings::AUTO_UPDATES_ONLY);
-
- EXPECT_CALL(
- callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR,
- GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
- task_runner_->RunUntilIdle();
-}
-
-TEST_P(GoogleUpdateWinTest, MultiManualUpdatesDisabledByPolicy) {
- // Disable updates altogether.
- SetAppUpdatePolicy(kChromeBinariesGuid,
- GoogleUpdateSettings::AUTO_UPDATES_ONLY);
-
- EXPECT_CALL(
- callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR,
- GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
- task_runner_->RunUntilIdle();
-}
-
+// Test the case where the GoogleUpdate class can't be created for an update
+// check.
TEST_P(GoogleUpdateWinTest, NoGoogleUpdateForCheck) {
// The factory should be called upon: let it fail.
EXPECT_CALL(mock_google_update_factory_, Create(_));
// Expect the appropriate error when the on-demand class cannot be created.
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(
- UPGRADE_ERROR, GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnError(GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _));
+ BeginUpdateCheck(task_runner_, std::string(), false, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
+// Test the case where the GoogleUpdate class can't be created for an upgrade.
TEST_P(GoogleUpdateWinTest, NoGoogleUpdateForUpgrade) {
// The factory should be called upon: let it fail.
EXPECT_CALL(mock_google_update_factory_, Create(_));
// Expect the appropriate error when the on-demand class cannot be created.
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(
- UPGRADE_ERROR, GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _));
- BeginUpdateCheck(task_runner_, true, 0, callback_receiver_.GetCallback());
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnError(GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, _, _));
+ BeginUpdateCheck(task_runner_, std::string(), true, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
+// Test the case where the GoogleUpdate class returns an error when an update
+// check is started.
TEST_P(GoogleUpdateWinTest, FailUpdateCheck) {
// The factory should be called upon: let it return the mock on-demand class.
- EXPECT_CALL(mock_google_update_factory_, Create(_))
- .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK)));
- // The mock on-demand class should be called.
- EXPECT_CALL(*mock_on_demand_, CheckForUpdate(StrEq(kChromeBinariesGuid), _));
-
- EXPECT_CALL(
- callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR,
- GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR, _, _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
+ PrepareSimulator(kChromeBinariesGuid);
+ // checkForUpdate will fail.
+ EXPECT_CALL(*mock_app_bundle_, checkForUpdate())
+ .WillOnce(Return(E_FAIL));
+
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnError(GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR, _, _));
+ BeginUpdateCheck(task_runner_, std::string(), false, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
+// Test the case where the GoogleUpdate class reports that updates are disabled
+// by Group Policy.
+TEST_P(GoogleUpdateWinTest, UpdatesDisabledByPolicy) {
+ static const HRESULT GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY = 0x80040813;
+ PrepareSimulatorForUpdateCheck(kChromeBinariesGuid);
+ PushState(STATE_INIT);
+ PushState(STATE_CHECKING_FOR_UPDATE);
+ PushErrorState(GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY,
+ L"disabled by policy", -1);
+
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnError(GOOGLE_UPDATE_DISABLED_BY_POLICY, _, _));
+ BeginUpdateCheck(task_runner_, std::string(), false, 0,
+ mock_update_check_delegate_.AsWeakPtr());
+ task_runner_->RunUntilIdle();
+}
+
+// Test an update check where no update is available.
TEST_P(GoogleUpdateWinTest, UpdateCheckNoUpdate) {
- EXPECT_CALL(mock_google_update_factory_, Create(_))
- .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK)));
- mock_on_demand_->OnCheckRunUpToDateSequence(kChromeBinariesGuid);
-
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ALREADY_UP_TO_DATE,
- GOOGLE_UPDATE_NO_ERROR, IsEmpty(), _));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
+ PrepareSimulatorForUpdateCheck(kChromeBinariesGuid);
+ PushState(STATE_INIT);
+ PushState(STATE_CHECKING_FOR_UPDATE);
+ PushState(STATE_NO_UPDATE);
+
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpdateCheckComplete(IsEmpty())); // new_version
+ BeginUpdateCheck(task_runner_, std::string(), false, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
+// Test an update check where an update is available.
TEST_P(GoogleUpdateWinTest, UpdateCheckUpdateAvailable) {
- EXPECT_CALL(mock_google_update_factory_, Create(_))
- .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK)));
- mock_on_demand_->OnCheckRunUpdateAvailableSequence(kChromeBinariesGuid,
- new_version_);
-
- EXPECT_CALL(
- callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_IS_AVAILABLE, GOOGLE_UPDATE_NO_ERROR,
- IsEmpty(), StrEq(new_version_)));
- BeginUpdateCheck(task_runner_, false, 0, callback_receiver_.GetCallback());
+ PrepareSimulatorForUpdateCheck(kChromeBinariesGuid);
+ PushState(STATE_INIT);
+ PushState(STATE_CHECKING_FOR_UPDATE);
+ PushUpdateAvailableState(new_version_);
+
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpdateCheckComplete(StrEq(new_version_)));
+ BeginUpdateCheck(task_runner_, std::string(), false, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
+// Test a successful upgrade.
TEST_P(GoogleUpdateWinTest, UpdateInstalled) {
- EXPECT_CALL(mock_google_update_factory_, Create(_))
- .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK)));
- mock_on_demand_->OnUpdateRunInstallUpdateSequence(kChromeBinariesGuid,
- new_version_);
-
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_SUCCESSFUL, GOOGLE_UPDATE_NO_ERROR,
- IsEmpty(), StrEq(new_version_)));
- BeginUpdateCheck(task_runner_, true, 0, callback_receiver_.GetCallback());
+ PrepareSimulatorForUpgrade(kChromeBinariesGuid);
+ PushState(STATE_INIT);
+ PushState(STATE_CHECKING_FOR_UPDATE);
+ PushUpdateAvailableState(new_version_);
+ PushState(STATE_WAITING_TO_DOWNLOAD);
+ PushProgressiveState(STATE_DOWNLOADING, 0);
+ PushProgressiveState(STATE_DOWNLOADING, 25);
+ PushProgressiveState(STATE_DOWNLOADING, 25);
+ PushProgressiveState(STATE_DOWNLOADING, 75);
+ PushState(STATE_WAITING_TO_INSTALL);
+ PushProgressiveState(STATE_INSTALLING, 50);
+ PushState(STATE_INSTALL_COMPLETE);
+
+ {
+ InSequence callback_sequence;
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(0, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(12, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(37, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(50, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(75, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeComplete(StrEq(new_version_)));
+ }
+ BeginUpdateCheck(task_runner_, std::string(), true, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}
+// Test a failed upgrade where Google Update reports that the installer failed.
TEST_P(GoogleUpdateWinTest, UpdateFailed) {
- static const base::char16 kError[] = L"It didn't work.";
- EXPECT_CALL(mock_google_update_factory_, Create(_))
- .WillOnce(DoAll(SetArgPointee<0>(mock_on_demand_), Return(S_OK)));
- mock_on_demand_->OnUpdateRunUpdateErrorSequence(kChromeBinariesGuid, kError);
-
- EXPECT_CALL(callback_receiver_,
- OnUpdateCheckCallback(UPGRADE_ERROR, GOOGLE_UPDATE_ERROR_UPDATING,
- StrEq(kError), IsEmpty()));
- BeginUpdateCheck(task_runner_, true, 0, callback_receiver_.GetCallback());
+ const base::string16 error(L"It didn't work.");
+ static const HRESULT GOOPDATEINSTALL_E_INSTALLER_FAILED = 0x80040902;
+ static const int kInstallerError = 12;
+
+ PrepareSimulatorForUpgrade(kChromeBinariesGuid);
+ PushState(STATE_INIT);
+ PushState(STATE_CHECKING_FOR_UPDATE);
+ PushUpdateAvailableState(new_version_);
+ PushState(STATE_WAITING_TO_DOWNLOAD);
+ PushProgressiveState(STATE_DOWNLOADING, 0);
+ PushProgressiveState(STATE_DOWNLOADING, 25);
+ PushProgressiveState(STATE_DOWNLOADING, 25);
+ PushProgressiveState(STATE_DOWNLOADING, 75);
+ PushState(STATE_WAITING_TO_INSTALL);
+ PushProgressiveState(STATE_INSTALLING, 50);
+ PushErrorState(GOOPDATEINSTALL_E_INSTALLER_FAILED, error, kInstallerError);
+
+ {
+ InSequence callback_sequence;
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(0, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(12, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(37, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(50, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnUpgradeProgress(75, StrEq(new_version_)));
+ EXPECT_CALL(mock_update_check_delegate_,
+ OnError(GOOGLE_UPDATE_ERROR_UPDATING, HasSubstr(error),
+ StrEq(new_version_)));
+ }
+ BeginUpdateCheck(task_runner_, std::string(), true, 0,
+ mock_update_check_delegate_.AsWeakPtr());
task_runner_->RunUntilIdle();
}

Powered by Google App Engine
This is Rietveld 408576698