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

Unified Diff: goopdate/worker_unittest.cc

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 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
« no previous file with comments | « goopdate/worker_mock.h ('k') | goopdate/worker_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: goopdate/worker_unittest.cc
diff --git a/goopdate/worker_unittest.cc b/goopdate/worker_unittest.cc
deleted file mode 100644
index 1e5784aa25bdb856bbd6834fe42eda7b68c396f1..0000000000000000000000000000000000000000
--- a/goopdate/worker_unittest.cc
+++ /dev/null
@@ -1,874 +0,0 @@
-// Copyright 2009-2010 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// ========================================================================
-
-#include "base/scoped_ptr.h"
-#include "omaha/base/app_util.h"
-#include "omaha/base/const_addresses.h"
-#include "omaha/common/config_manager.h"
-#include "omaha/common/web_services_client.h"
-#include "omaha/goopdate/app_bundle_state_busy.h"
-#include "omaha/goopdate/app_manager.h"
-#include "omaha/goopdate/app_state_ready_to_install.h"
-#include "omaha/goopdate/app_state_update_available.h"
-#include "omaha/goopdate/download_manager.h"
-#include "omaha/goopdate/goopdate.h"
-#include "omaha/goopdate/install_manager.h"
-#include "omaha/goopdate/installer_result_info.h"
-#include "omaha/goopdate/model.h"
-#include "omaha/goopdate/resource_manager.h"
-#include "omaha/goopdate/worker.h"
-#include "omaha/goopdate/worker_internal.h"
-#include "omaha/goopdate/worker_metrics.h"
-#include "omaha/testing/unit_test.h"
-
-namespace omaha {
-
-using ::testing::_;
-using ::testing::Return;
-
-namespace {
-
-// TODO(omaha): Change these to invalid IDs once the TODO above
-// UpdateResponse::GetResult is fixed. Until then, invalid IDs cause asserts.
-// Also, the large tests need valid files to download.
-#if 0
-const TCHAR* const kGuid1 = _T("{8A001254-1003-465e-A970-0748961C5293}");
-const TCHAR* const kGuid2 = _T("{058ADDBE-BF10-4ba1-93C0-6F4A52C03C7E}");
-#else
-const TCHAR* const kGuid1 = _T("{ADDE8406-A0F3-4AC2-8878-ADC0BD37BD86}");
-const TCHAR* const kGuid2 = _T("{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}");
-#endif
-
-// The alphabetical order of these is important for
-// RecordUpdateAvailableUsageStatsTest.
-const TCHAR* const kApp1 = _T("{0C480772-AC73-418f-9603-66303DA4C7AA}");
-const TCHAR* const kApp2 = _T("{89906BCD-4D12-4c9b-B5BA-8286051CB8D9}");
-const TCHAR* const kApp3 = _T("{F5A1FE97-CF5A-47b8-8B28-2A72F9A57A45}");
-
-const uint64 kApp1GuidUpper = 0x0C480772AC73418f;
-const uint64 kApp2GuidUpper = 0x89906BCD4D124c9b;
-
-const TCHAR* const kApp1ClientsKeyPathUser =
- _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
- _T("\\Clients\\{0C480772-AC73-418f-9603-66303DA4C7AA}");
-const TCHAR* const kApp2ClientsKeyPathUser =
- _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
- _T("\\Clients\\{89906BCD-4D12-4c9b-B5BA-8286051CB8D9}");
-const TCHAR* const kApp3ClientsKeyPathUser =
- _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
- _T("\\Clients\\{F5A1FE97-CF5A-47b8-8B28-2A72F9A57A45}");
-
-const TCHAR* const kApp1ClientStateKeyPathUser =
- _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
- _T("\\ClientState\\{0C480772-AC73-418f-9603-66303DA4C7AA}");
-const TCHAR* const kApp2ClientStateKeyPathUser =
- _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
- _T("\\ClientState\\{89906BCD-4D12-4c9b-B5BA-8286051CB8D9}");
-const TCHAR* const kApp3ClientStateKeyPathUser =
- _T("HKCU\\Software\\") SHORT_COMPANY_NAME _T("\\") PRODUCT_NAME
- _T("\\ClientState\\{F5A1FE97-CF5A-47b8-8B28-2A72F9A57A45}");
-
-void SetAppStateUpdateAvailable(App* app) {
- SetAppStateForUnitTest(app, new fsm::AppStateUpdateAvailable);
-}
-
-void SetAppStateReadyToInstall(App* app) {
- SetAppStateForUnitTest(app, new fsm::AppStateReadyToInstall);
-}
-
-class MockWebServicesClient : public WebServicesClientInterface {
- public:
- MOCK_METHOD2(Send,
- HRESULT(const xml::UpdateRequest* update_request,
- xml::UpdateResponse* update_response));
- MOCK_METHOD2(SendString,
- HRESULT(const CString* request_string,
- xml::UpdateResponse* update_response));
- MOCK_METHOD0(Cancel,
- void());
- MOCK_METHOD1(set_proxy_auth_config,
- void(const ProxyAuthConfig& config));
- MOCK_CONST_METHOD0(is_http_success,
- bool());
- MOCK_CONST_METHOD0(http_status_code,
- int());
- MOCK_CONST_METHOD0(http_trace,
- CString());
-};
-
-class MockDownloadManager : public DownloadManagerInterface {
- public:
- MOCK_METHOD0(Initialize,
- HRESULT());
- MOCK_METHOD2(PurgeAppLowerVersions,
- HRESULT(const CString&, const CString&));
- MOCK_METHOD2(CachePackage,
- HRESULT(const Package*, const CString*));
- MOCK_METHOD1(DownloadApp,
- HRESULT(App* app));
- MOCK_METHOD1(DownloadPackage,
- HRESULT(Package* package));
- MOCK_CONST_METHOD2(GetPackage,
- HRESULT(const Package*, const CString&));
- MOCK_METHOD1(Cancel,
- void(App* app));
- MOCK_METHOD0(CancelAll,
- void());
- MOCK_CONST_METHOD0(IsBusy,
- bool());
- MOCK_CONST_METHOD1(IsPackageAvailable,
- bool(const Package* package)); // NOLINT
-};
-
-class MockInstallManager : public InstallManagerInterface {
- public:
- MOCK_METHOD0(Initialize,
- HRESULT());
- MOCK_CONST_METHOD0(install_working_dir,
- CString());
- MOCK_METHOD2(InstallApp,
- void(App* app, const CString& dir));
-};
-
-ACTION(SimulateDownloadAppStateTransition) {
- UNREFERENCED_ACTION_PARAMETERS;
- arg0->Downloading();
- arg0->DownloadComplete();
- // TODO(omaha3): Simulate extract and differential update once implemented.
- arg0->MarkReadyToInstall();
- return 0;
-}
-
-ACTION(SimulateInstallAppStateTransition) {
- UNREFERENCED_ACTION_PARAMETERS;
- arg0->Installing();
-
- AppManager& app_manager = *AppManager::Instance();
- __mutexScope(app_manager.GetRegistryStableStateLock());
-
- InstallerResultInfo result_info;
- result_info.type = INSTALLER_RESULT_SUCCESS;
- result_info.text = _T("success");
- arg0->ReportInstallerComplete(result_info);
-}
-
-void WaitForAppToEnterState(const App& app,
- CurrentState expected_state,
- int timeout_sec) {
- const int kPeriodMs = 50;
- const int max_tries = timeout_sec * 1000 / kPeriodMs;
- for (int tries = 0; tries < max_tries; ++tries) {
- if (expected_state == app.state()) {
- break;
- }
- ::Sleep(kPeriodMs);
- }
- EXPECT_EQ(expected_state, app.state());
-}
-
-// Assumes the caller has verified the bundle is busy. Otherwise, this could
-// return before the bundle enters the busy state.
-void WaitForBundleToBeReady(const AppBundle& app_bundle, int timeout_sec) {
- const int kPeriodMs = 50;
- const int max_tries = timeout_sec * 1000 / kPeriodMs;
- for (int tries = 0; tries < max_tries; ++tries) {
- if (!app_bundle.IsBusy()) {
- return;
- }
- ::Sleep(kPeriodMs);
- }
- ADD_FAILURE() << _T("Timed out waiting for AppBundle to be ready.");
-}
-
-} // namespace
-
-// All tests use a user instance of the Worker.
-
-class WorkerTest : public testing::Test {
- protected:
- WorkerTest() : is_machine_(false), goopdate_(is_machine_), worker_(NULL) {}
-
- virtual void SetUp() {
- worker_ = &Worker::Instance();
-
- worker_->Initialize(is_machine_);
-
- EXPECT_SUCCEEDED(ResourceManager::Create(
- is_machine_, app_util::GetCurrentModuleDirectory(), _T("en")));
- }
-
- virtual void TearDown() {
- worker_ = NULL;
- Worker::DeleteInstance();
- ResourceManager::Delete();
- }
-
- // Overrides the update check client of the bundle.
- void SetUpdateCheckClient(AppBundle* app_bundle,
- WebServicesClientInterface* web_services_client) {
- app_bundle->update_check_client_.reset(web_services_client);
- }
-
- void SetWorkerDownloadManager(DownloadManagerInterface* download_manager) {
- ASSERT_TRUE(download_manager);
- worker_->download_manager_.reset(download_manager);
- }
-
- void SetWorkerInstallManager(InstallManagerInterface* install_manager) {
- ASSERT_TRUE(install_manager);
- worker_->install_manager_.reset(install_manager);
- }
-
- const bool is_machine_;
- Goopdate goopdate_;
- Worker* worker_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(WorkerTest);
-};
-
-class WorkerWithBundleTest : public WorkerTest {
- protected:
- WorkerWithBundleTest() : WorkerTest() {}
-
- virtual void SetUp() {
- WorkerTest::SetUp();
-
- app_bundle_ = worker_->model()->CreateAppBundle(is_machine_);
- ASSERT_TRUE(app_bundle_.get());
-
- EXPECT_SUCCEEDED(app_bundle_->put_displayName(CComBSTR(_T("My Bundle"))));
- EXPECT_SUCCEEDED(app_bundle_->put_displayLanguage(CComBSTR(_T("en"))));
- EXPECT_SUCCEEDED(app_bundle_->initialize());
-
- CString update_check_url;
- ConfigManager::Instance()->GetUpdateCheckUrl(&update_check_url);
- WebServicesClient* web_service_client = new WebServicesClient(is_machine_);
- EXPECT_HRESULT_SUCCEEDED(web_service_client->Initialize(update_check_url,
- HeadersVector(),
- true));
- SetUpdateCheckClient(app_bundle_.get(), web_service_client);
- }
-
- virtual void TearDown() {
- app_bundle_.reset();
-
- WorkerTest::TearDown();
- }
-
- shared_ptr<AppBundle> app_bundle_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(WorkerWithBundleTest);
-};
-
-// The EULA is accepted for both apps.
-class WorkerWithTwoAppsTest : public WorkerWithBundleTest {
- protected:
- WorkerWithTwoAppsTest() : WorkerWithBundleTest(), app1_(NULL), app2_(NULL) {}
-
- virtual void SetUp() {
- WorkerWithBundleTest::SetUp();
-
- EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app1_));
- EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid2), &app2_));
-
- EXPECT_SUCCEEDED(app1_->put_isEulaAccepted(VARIANT_TRUE));
- EXPECT_SUCCEEDED(app2_->put_isEulaAccepted(VARIANT_TRUE));
- }
-
- virtual void TearDown() {
- WorkerWithBundleTest::TearDown();
- }
-
- App* app1_;
- App* app2_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(WorkerWithTwoAppsTest);
-};
-
-// Mocks the DownloadManager and InstallManager.
-class WorkerMockedManagersTest : public WorkerWithTwoAppsTest {
- protected:
- WorkerMockedManagersTest()
- : WorkerWithTwoAppsTest(),
- mock_web_services_client_(),
- mock_download_manager_(NULL),
- mock_install_manager_(NULL) {
- }
-
- virtual void SetUp() {
- WorkerWithTwoAppsTest::SetUp();
-
- // By default, no methods should be called on web service client and install
- // manager, so make them StrictMock. Override this behavior for specific
- // methods in the individual test cases.
- mock_web_services_client_ = new testing::StrictMock<MockWebServicesClient>;
- mock_install_manager_ = new testing::StrictMock<MockInstallManager>;
-
- // Some functions will be called on the mock download manager, so make it
- // NiceMock.
- mock_download_manager_ = new testing::NiceMock<MockDownloadManager>;
-
- // The App Bundle takes ownership.
- SetUpdateCheckClient(app_bundle_.get(), mock_web_services_client_);
-
- // The Worker takes ownership of the Manager mocks.
- SetWorkerDownloadManager(mock_download_manager_);
- SetWorkerInstallManager(mock_install_manager_);
- }
-
- virtual void TearDown() {
- WorkerWithTwoAppsTest::TearDown();
- }
-
- // Pointers used by tests to set behavior. Not owned by this instance.
- MockWebServicesClient* mock_web_services_client_;
- MockDownloadManager* mock_download_manager_;
- MockInstallManager* mock_install_manager_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(WorkerMockedManagersTest);
-};
-
-TEST_F(WorkerMockedManagersTest, CheckForUpdateAsync) {
- EXPECT_CALL(*mock_web_services_client_, Send(_, _))
- .Times(1);
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->CheckForUpdateAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- // TODO(omaha3): The update check fails because there is not a real response.
- // Fix this.
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_FALSE(app_bundle_->IsBusy());
- EXPECT_EQ(STATE_ERROR, app1_->state());
- EXPECT_EQ(STATE_ERROR, app2_->state());
-}
-
-TEST_F(WorkerMockedManagersTest, DownloadAsync) {
- SetAppStateUpdateAvailable(app1_);
- SetAppStateUpdateAvailable(app2_);
-
- {
- ::testing::InSequence dummy;
- EXPECT_CALL(*mock_download_manager_, DownloadApp(app1_))
- .WillOnce(SimulateDownloadAppStateTransition());
- EXPECT_CALL(*mock_download_manager_, DownloadApp(app2_))
- .WillOnce(SimulateDownloadAppStateTransition());
- }
-
- // Holding the lock prevents the state from changing in the other thread,
- // ensuring consistent results.
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_EQ(STATE_READY_TO_INSTALL, app1_->state());
- EXPECT_EQ(STATE_READY_TO_INSTALL, app2_->state());
-}
-
-TEST_F(WorkerMockedManagersTest, DownloadAndInstallAsync_AlreadyDownloaded) {
- SetAppStateReadyToInstall(app1_);
- SetAppStateReadyToInstall(app2_);
-
- EXPECT_CALL(*mock_install_manager_, install_working_dir())
- .WillRepeatedly(Return(app_util::GetTempDir()));
-
- {
- ::testing::InSequence dummy;
- EXPECT_CALL(*mock_install_manager_, InstallApp(app1_, _))
- .WillOnce(SimulateInstallAppStateTransition());
- EXPECT_CALL(*mock_install_manager_, InstallApp(app2_, _))
- .WillOnce(SimulateInstallAppStateTransition());
- }
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAndInstallAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_INSTALL, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_INSTALL, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app1_->state());
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app2_->state());
-}
-
-TEST_F(WorkerMockedManagersTest, DownloadAndInstallAsync_NotAlreadyDownloaded) {
- SetAppStateUpdateAvailable(app1_);
- SetAppStateUpdateAvailable(app2_);
-
- EXPECT_CALL(*mock_install_manager_, install_working_dir())
- .WillRepeatedly(Return(app_util::GetTempDir()));
-
- {
- ::testing::InSequence dummy;
- EXPECT_CALL(*mock_download_manager_, DownloadApp(app1_))
- .WillOnce(SimulateDownloadAppStateTransition());
- EXPECT_CALL(*mock_install_manager_, InstallApp(app1_, _))
- .WillOnce(SimulateInstallAppStateTransition());
- EXPECT_CALL(*mock_download_manager_, DownloadApp(app2_))
- .WillOnce(SimulateDownloadAppStateTransition());
- EXPECT_CALL(*mock_install_manager_, InstallApp(app2_, _))
- .WillOnce(SimulateInstallAppStateTransition());
- }
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAndInstallAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app1_->state());
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app2_->state());
-}
-
-TEST_F(WorkerMockedManagersTest, DownloadAsync_Then_DownloadAndInstallAsync) {
- SetAppStateUpdateAvailable(app1_);
- SetAppStateUpdateAvailable(app2_);
-
- {
- ::testing::InSequence dummy;
- EXPECT_CALL(*mock_download_manager_, DownloadApp(app1_))
- .WillOnce(SimulateDownloadAppStateTransition());
- EXPECT_CALL(*mock_download_manager_, DownloadApp(app2_))
- .WillOnce(SimulateDownloadAppStateTransition());
- }
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_EQ(STATE_READY_TO_INSTALL, app1_->state());
- EXPECT_EQ(STATE_READY_TO_INSTALL, app2_->state());
-
- EXPECT_CALL(*mock_install_manager_, install_working_dir())
- .WillRepeatedly(Return(app_util::GetTempDir()));
-
- {
- ::testing::InSequence dummy;
- EXPECT_CALL(*mock_install_manager_, InstallApp(app1_, _))
- .WillOnce(SimulateInstallAppStateTransition());
- EXPECT_CALL(*mock_install_manager_, InstallApp(app2_, _))
- .WillOnce(SimulateInstallAppStateTransition());
- }
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAndInstallAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_INSTALL, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_INSTALL, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app1_->state());
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app2_->state());
-}
-
-TEST_F(WorkerMockedManagersTest, UpdateAllAppsAsync) {
- EXPECT_CALL(*mock_web_services_client_, Send(_, _))
- .Times(1);
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->UpdateAllAppsAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- // TODO(omaha3): The update check fails because there is not a real response.
- // Fix this and continue the test, ensuring it gets to install complete.
- WaitForBundleToBeReady(*app_bundle_, 5);
- EXPECT_FALSE(app_bundle_->IsBusy());
- EXPECT_EQ(STATE_ERROR, app1_->state());
- EXPECT_EQ(STATE_ERROR, app2_->state());
-}
-
-// TODO(omaha): Add tests for app already in error state, app failing download
-// or install, all apps failed or failing, etc.
-
-//
-// Large Tests
-// These are large tests because they use threads and access the network.
-// TODO(omaha): Move these to a separate test executable when using Hammer to
-// run tests.
-//
-
-TEST_F(WorkerWithTwoAppsTest, CheckForUpdateAsync_Large) {
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->CheckForUpdateAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 10);
- EXPECT_EQ(STATE_UPDATE_AVAILABLE, app1_->state());
- EXPECT_EQ(STATE_UPDATE_AVAILABLE, app2_->state());
-}
-
-TEST_F(WorkerWithTwoAppsTest,
- DownloadAsyncThenDownloadAndInstallAsync_Large) {
- // Update Check: Request then wait for it to complete in the thread pool.
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->CheckForUpdateAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 10);
- EXPECT_EQ(STATE_UPDATE_AVAILABLE, app1_->state());
- EXPECT_EQ(STATE_UPDATE_AVAILABLE, app2_->state());
-
- // Download: Request then wait for it to complete in the thread pool.
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 25);
- EXPECT_EQ(STATE_READY_TO_INSTALL, app1_->state());
- EXPECT_EQ(STATE_READY_TO_INSTALL, app2_->state());
-
- // Install: Request then wait for it to complete in the thread pool.
-
- // TODO(omaha): Make User Foo installer available from production, change
- // GUID(s), and enable the code below. Be sure to uninstall the app when done.
-#if 0
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAndInstallAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_INSTALL, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_INSTALL, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 10);
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app1_->state());
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app2_->state());
-#endif
-}
-
-TEST_F(WorkerWithTwoAppsTest, DownloadAndInstallAsyncWithoutDownload_Large) {
- // Update Check: Request then wait for it to complete in the thread pool.
-
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->CheckForUpdateAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 10);
- EXPECT_EQ(STATE_UPDATE_AVAILABLE, app1_->state());
- EXPECT_EQ(STATE_UPDATE_AVAILABLE, app2_->state());
-
- // Download and install: Request then wait for it to complete in thread pool.
-
- // TODO(omaha): Make User Foo installer available from production, change
- // GUID(s), and enable the code below. Be sure to uninstall the app when done.
-#if 0
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->DownloadAndInstallAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_DOWNLOAD, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
- }
-
- WaitForBundleToBeReady(*app_bundle_, 10);
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app1_->state());
- EXPECT_EQ(STATE_INSTALL_COMPLETE, app2_->state());
-#endif
-}
-
-// Also tests cancellation of a bundle during the update check phase.
-TEST_F(WorkerWithTwoAppsTest, UpdateAllAppsAsync_Large) {
- __mutexBlock(worker_->model()->lock()) {
- EXPECT_SUCCEEDED(worker_->UpdateAllAppsAsync(app_bundle_.get()));
-
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app1_->state());
- EXPECT_EQ(STATE_WAITING_TO_CHECK_FOR_UPDATE, app2_->state());
-
- SetAppBundleStateForUnitTest(app_bundle_.get(),
- new fsm::AppBundleStateBusy);
- EXPECT_TRUE(app_bundle_->IsBusy());
-
- // Stop the bundle to prevent it from actually trying to update app.
- EXPECT_SUCCEEDED(app_bundle_->stop());
- }
-}
-
-class RecordUpdateAvailableUsageStatsTest : public testing::Test {
- protected:
- RecordUpdateAvailableUsageStatsTest() : is_machine_(false) {}
-
- static void SetUpTestCase() {
- stats_report::g_global_metrics.Initialize();
- }
-
- static void TearDownTestCase() {
- // The global metrics collection must be uninitialized before the metrics
- // destructors are called.
- stats_report::g_global_metrics.Uninitialize();
- }
-
- virtual void SetUp() {
- RegKey::DeleteKey(kRegistryHiveOverrideRoot);
- OverrideRegistryHives(kRegistryHiveOverrideRoot);
-
- EXPECT_SUCCEEDED(AppManager::CreateInstance(is_machine_));
-
- metric_worker_self_update_responses.Set(0);
- metric_worker_self_update_response_time_since_first_ms.Set(0);
- metric_worker_app_max_update_responses_app_high.Set(0);
- metric_worker_app_max_update_responses.Set(0);
- metric_worker_app_max_update_responses_ms_since_first.Set(0);
-
- ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENTS_GOOPDATE,
- kRegValueProductVersion,
- _T("0.1.0.0")));
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp1ClientsKeyPathUser,
- kRegValueProductVersion,
- _T("0.1")));
-
- ASSERT_SUCCEEDED(RegKey::CreateKey(USER_REG_CLIENT_STATE_GOOPDATE));
- ASSERT_SUCCEEDED(RegKey::CreateKey(kApp1ClientStateKeyPathUser));
- }
-
- int GetNumProducts() {
- AppManager& app_manager = *AppManager::Instance();
- AppIdVector registered_app_ids;
- VERIFY1(SUCCEEDED(app_manager.GetRegisteredApps(&registered_app_ids)));
- return registered_app_ids.size();
- }
-
- virtual void TearDown() {
- AppManager::DeleteInstance();
-
- RestoreRegistryHives();
- RegKey::DeleteKey(kRegistryHiveOverrideRoot);
- }
-
- bool is_machine_;
-};
-
-TEST_F(RecordUpdateAvailableUsageStatsTest, NoData) {
- ASSERT_EQ(2, GetNumProducts());
-
- internal::RecordUpdateAvailableUsageStats();
-
- EXPECT_EQ(0, metric_worker_self_update_responses.value());
- EXPECT_EQ(0, metric_worker_self_update_response_time_since_first_ms.value());
- EXPECT_EQ(0, metric_worker_app_max_update_responses_app_high.value());
- EXPECT_EQ(0, metric_worker_app_max_update_responses.value());
- EXPECT_EQ(0, metric_worker_app_max_update_responses_ms_since_first.value());
-}
-
-TEST_F(RecordUpdateAvailableUsageStatsTest, OmahaDataOnly) {
- ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENT_STATE_GOOPDATE,
- _T("UpdateAvailableCount"),
- static_cast<DWORD>(123456)));
- ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENT_STATE_GOOPDATE,
- _T("UpdateAvailableSince"),
- static_cast<DWORD64>(10)));
-
- ASSERT_EQ(2, GetNumProducts());
-
- const time64 current_time_100ns(GetCurrent100NSTime());
- const int64 expected_ms_since_first_update =
- (current_time_100ns - 10) / kMillisecsTo100ns;
-
- internal::RecordUpdateAvailableUsageStats();
-
- EXPECT_EQ(123456, metric_worker_self_update_responses.value());
-
- EXPECT_LE(expected_ms_since_first_update,
- metric_worker_self_update_response_time_since_first_ms.value());
- EXPECT_GT(expected_ms_since_first_update + 10 * kMsPerSec,
- metric_worker_self_update_response_time_since_first_ms.value());
-
- EXPECT_EQ(0, metric_worker_app_max_update_responses_app_high.value());
- EXPECT_EQ(0, metric_worker_app_max_update_responses.value());
- EXPECT_EQ(0, metric_worker_app_max_update_responses_ms_since_first.value());
-}
-
-TEST_F(RecordUpdateAvailableUsageStatsTest, OneAppOnly) {
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp1ClientStateKeyPathUser,
- _T("UpdateAvailableCount"),
- static_cast<DWORD>(123456)));
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp1ClientStateKeyPathUser,
- _T("UpdateAvailableSince"),
- static_cast<DWORD64>(10)));
-
- ASSERT_EQ(2, GetNumProducts());
-
- const time64 current_time_100ns(GetCurrent100NSTime());
- const int64 expected_ms_since_first_update =
- (current_time_100ns - 10) / kMillisecsTo100ns;
-
- internal::RecordUpdateAvailableUsageStats();
-
- EXPECT_EQ(0, metric_worker_self_update_responses.value());
- EXPECT_EQ(0, metric_worker_self_update_response_time_since_first_ms.value());
-
- EXPECT_EQ(kApp1GuidUpper,
- metric_worker_app_max_update_responses_app_high.value());
- EXPECT_EQ(123456, metric_worker_app_max_update_responses.value());
- EXPECT_LE(expected_ms_since_first_update,
- metric_worker_app_max_update_responses_ms_since_first.value());
- EXPECT_GT(expected_ms_since_first_update + 10 * kMsPerSec,
- metric_worker_app_max_update_responses_ms_since_first.value());
-}
-
-// It is important that Omaha's count is the largest.
-// All app data should be from app 2, which has the greatest count, a middle
-// time, and an alphabetically middle GUID
-TEST_F(RecordUpdateAvailableUsageStatsTest, OmahaAndSeveralApps) {
- const DWORD64 kApp2SinceTime = 1000 * kSecsTo100ns;
-
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp2ClientsKeyPathUser,
- kRegValueProductVersion,
- _T("1.2")));
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp3ClientsKeyPathUser,
- kRegValueProductVersion,
- _T("2.3")));
-
- ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENT_STATE_GOOPDATE,
- _T("UpdateAvailableCount"),
- static_cast<DWORD>(0x99887766)));
- ASSERT_SUCCEEDED(RegKey::SetValue(USER_REG_CLIENT_STATE_GOOPDATE,
- _T("UpdateAvailableSince"),
- static_cast<DWORD64>(1)));
-
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp1ClientStateKeyPathUser,
- _T("UpdateAvailableCount"),
- static_cast<DWORD>(1)));
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp1ClientStateKeyPathUser,
- _T("UpdateAvailableSince"),
- static_cast<DWORD64>(1)));
-
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp2ClientStateKeyPathUser,
- _T("UpdateAvailableCount"),
- static_cast<DWORD>(9876543)));
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp2ClientStateKeyPathUser,
- _T("UpdateAvailableSince"),
- kApp2SinceTime));
-
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp3ClientStateKeyPathUser,
- _T("UpdateAvailableCount"),
- static_cast<DWORD>(234)));
- ASSERT_SUCCEEDED(RegKey::SetValue(kApp3ClientStateKeyPathUser,
- _T("UpdateAvailableSince"),
- static_cast<DWORD64>(128580000000000000)));
-
- ASSERT_EQ(4, GetNumProducts());
-
- const time64 current_time_100ns(GetCurrent100NSTime());
- const int64 goopdate_expected_ms_since_first_update =
- (current_time_100ns - 1) / kMillisecsTo100ns;
-
- const int64 app_expected_ms_since_first_update =
- (current_time_100ns - kApp2SinceTime) / kMillisecsTo100ns;
-
- internal::RecordUpdateAvailableUsageStats();
-
- EXPECT_EQ(0x99887766, metric_worker_self_update_responses.value());
- EXPECT_LE(goopdate_expected_ms_since_first_update,
- metric_worker_self_update_response_time_since_first_ms.value());
- EXPECT_GT(goopdate_expected_ms_since_first_update + 10 * kMsPerSec,
- metric_worker_self_update_response_time_since_first_ms.value());
-
- EXPECT_EQ(kApp2GuidUpper,
- metric_worker_app_max_update_responses_app_high.value());
- EXPECT_EQ(9876543, metric_worker_app_max_update_responses.value());
- EXPECT_LE(app_expected_ms_since_first_update,
- metric_worker_app_max_update_responses_ms_since_first.value());
- EXPECT_GT(app_expected_ms_since_first_update + 10 * kMsPerSec,
- metric_worker_app_max_update_responses_ms_since_first.value());
-}
-
-} // namespace omaha
« no previous file with comments | « goopdate/worker_mock.h ('k') | goopdate/worker_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698