| Index: goopdate/download_manager_unittest.cc
|
| diff --git a/goopdate/download_manager_unittest.cc b/goopdate/download_manager_unittest.cc
|
| deleted file mode 100644
|
| index 29b3ef1f5afcaaa8bc6bbbd9389f43272090d88f..0000000000000000000000000000000000000000
|
| --- a/goopdate/download_manager_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1237 +0,0 @@
|
| -// Copyright 2008-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.
|
| -// ========================================================================
|
| -
|
| -// TODO(omaha): why so many dependencies for this unit test?
|
| -
|
| -#include <windows.h>
|
| -#include <atlstr.h>
|
| -#include "omaha/base/app_util.h"
|
| -#include "omaha/base/error.h"
|
| -#include "omaha/base/file.h"
|
| -#include "omaha/base/path.h"
|
| -#include "omaha/base/scoped_any.h"
|
| -#include "omaha/base/scoped_ptr_address.h"
|
| -#include "omaha/base/signatures.h"
|
| -#include "omaha/base/thread_pool.h"
|
| -#include "omaha/base/timer.h"
|
| -#include "omaha/base/utils.h"
|
| -#include "omaha/base/vistautil.h"
|
| -#include "omaha/base/vista_utils.h"
|
| -#include "omaha/common/config_manager.h"
|
| -#include "omaha/goopdate/app_state_checking_for_update.h"
|
| -#include "omaha/goopdate/app_state_waiting_to_download.h"
|
| -#include "omaha/goopdate/app_unittest_base.h"
|
| -#include "omaha/goopdate/download_manager.h"
|
| -#include "omaha/goopdate/update_response_utils.h"
|
| -#include "omaha/testing/unit_test.h"
|
| -
|
| -using ::testing::_;
|
| -using ::testing::Return;
|
| -
|
| -namespace omaha {
|
| -
|
| -namespace {
|
| -
|
| -const TCHAR kUpdateBinHash[] = _T("YF2z/br/S6E3KTca0MT7qziJN44=");
|
| -const TCHAR kUpdateBin1Hash[] = _T("tbYInfmArVRUD62Ex292vN4LtGQ=");
|
| -
|
| -const TCHAR kAppGuid1[] = _T("{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}");
|
| -const TCHAR kAppGuid2[] = _T("{C7F2B395-A01C-4806-AA07-9163F66AFC48}");
|
| -
|
| -
|
| -class DownloadAppWorkItem : public UserWorkItem {
|
| - public:
|
| - DownloadAppWorkItem(DownloadManager* download_manager, App* app)
|
| - : download_manager_(download_manager), app_(app) {}
|
| -
|
| - private:
|
| - virtual void DoProcess() {
|
| - download_manager_->DownloadApp(app_);
|
| - }
|
| -
|
| - DownloadManager* download_manager_;
|
| - App* app_;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(DownloadAppWorkItem);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class DownloadManagerTest : public AppTestBase {
|
| - public:
|
| - static HRESULT BuildUniqueFileName(const CString& filename,
|
| - CString* unique_filename) {
|
| - return DownloadManager::BuildUniqueFileName(filename,
|
| - unique_filename);
|
| - }
|
| -
|
| - protected:
|
| - explicit DownloadManagerTest(bool is_machine)
|
| - : AppTestBase(is_machine, true) {}
|
| -
|
| - virtual void SetUp() {
|
| - AppTestBase::SetUp();
|
| -
|
| - CleanupFiles();
|
| -
|
| - download_manager_.reset(new DownloadManager(is_machine_));
|
| - EXPECT_SUCCEEDED(download_manager_->Initialize());
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - download_manager_.reset();
|
| - CleanupFiles();
|
| -
|
| - AppTestBase::TearDown();
|
| - }
|
| -
|
| - virtual void CleanupFiles() = 0;
|
| -
|
| - static HRESULT LoadBundleFromXml(AppBundle* app_bundle,
|
| - const CStringA& buffer_string) {
|
| - __mutexScope(app_bundle->model()->lock());
|
| -
|
| - std::vector<uint8> buffer(buffer_string.GetLength());
|
| - memcpy(&buffer.front(), buffer_string, buffer.size());
|
| -
|
| - scoped_ptr<xml::UpdateResponse> update_response(
|
| - xml::UpdateResponse::Create());
|
| - HRESULT hr = update_response->Deserialize(buffer);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - for (size_t i = 0; i != app_bundle->GetNumberOfApps(); ++i) {
|
| - hr = update_response_utils::BuildApp(update_response.get(),
|
| - S_OK,
|
| - app_bundle->GetApp(i));
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - }
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - static void SetAppStateCheckingForUpdate(App* app) {
|
| - SetAppStateForUnitTest(app, new fsm::AppStateCheckingForUpdate);
|
| - }
|
| -
|
| - static void SetAppStateWaitingToDownload(App* app) {
|
| - SetAppStateForUnitTest(app, new fsm::AppStateWaitingToDownload);
|
| - }
|
| -
|
| - const CString cache_path_;
|
| - scoped_ptr<DownloadManager> download_manager_;
|
| -};
|
| -
|
| -
|
| -class DownloadManagerMachineTest : public DownloadManagerTest {
|
| - protected:
|
| - DownloadManagerMachineTest() : DownloadManagerTest(true) {}
|
| -
|
| - virtual void CleanupFiles() {
|
| - ConfigManager* cm(ConfigManager::Instance());
|
| - DeleteDirectory(cm->GetMachineInstallWorkingDir());
|
| - DeleteDirectory(cm->GetMachineSecureDownloadStorageDir());
|
| - }
|
| -};
|
| -
|
| -class DownloadManagerUserTest : public DownloadManagerTest {
|
| - protected:
|
| - DownloadManagerUserTest() : DownloadManagerTest(false) {}
|
| -
|
| - virtual void CleanupFiles() {
|
| - ConfigManager* cm(ConfigManager::Instance());
|
| - DeleteDirectory(cm->GetUserInstallWorkingDir());
|
| - DeleteDirectory(cm->GetUserDownloadStorageDir());
|
| - }
|
| -};
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_MultiplePackagesInOneApp) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // One app, two packages.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "<package "
|
| - "hash=\"tbYInfmArVRUD62Ex292vN4LtGQ=\" "
|
| - "name=\"UpdateData1.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - // Tests the first package.
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Tests the second package.
|
| - package = app->next_version()->GetPackage(1);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData1.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBin1Hash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -// Downloads multiple apps serially.
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_MultipleApps) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid2), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App2"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Two apps, one package each.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "<app appid=\"{C7F2B395-A01C-4806-AA07-9163F66AFC48}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"2.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"tbYInfmArVRUD62Ex292vN4LtGQ=\" "
|
| - "name=\"UpdateData1.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| -
|
| - // Tests the first app.
|
| - app = app_bundle_->GetApp(0);
|
| - ASSERT_TRUE(app);
|
| - SetAppStateWaitingToDownload(app);
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Tests the second app.
|
| - app = app_bundle_->GetApp(1);
|
| - ASSERT_TRUE(app);
|
| - SetAppStateWaitingToDownload(app);
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData1.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBin1Hash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -// Downloads multiple apps concurrently. The test builds a bundle of two
|
| -// apps, creates two thread pool work items to download the apps, waits
|
| -// for the downloads to complete, and then checks the results of each download.
|
| -// This is essentialy the same unit test as DownloadApp_MultipleApps done
|
| -// concurrently instead of serially.
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_Concurrent) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid2), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App2"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Two apps, one package each.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "<app appid=\"{C7F2B395-A01C-4806-AA07-9163F66AFC48}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"2.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"tbYInfmArVRUD62Ex292vN4LtGQ=\" "
|
| - "name=\"UpdateData1.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| -
|
| - // The thread pool waits up to 1 minute for the work items to complete when
|
| - // the thread pool object is destroyed.
|
| - const int kShutdownDelayMs = 60000;
|
| -
|
| - ThreadPool thread_pool;
|
| - ASSERT_HRESULT_SUCCEEDED(thread_pool.Initialize(kShutdownDelayMs));
|
| -
|
| - const int kNumApps = 2;
|
| -
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - app = app_bundle_->GetApp(i);
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - scoped_ptr<DownloadAppWorkItem> work_item(
|
| - new DownloadAppWorkItem(download_manager_.get(), app));
|
| -
|
| - // WT_EXECUTELONGFUNCTION causes the thread pool to use multiple threads.
|
| - ASSERT_HRESULT_SUCCEEDED(thread_pool.QueueUserWorkItem(
|
| - work_item.release(),
|
| - WT_EXECUTELONGFUNCTION));
|
| - }
|
| -
|
| - // Poll the state of the download manager and wait up to 1 minute for the
|
| - // downloads to complete.
|
| - const int kTimeToWaitForDownloadsMs = 60000;
|
| - const int kTimeToSleepWhenPollingMs = 10;
|
| -
|
| - // Wait some time for the download manager to pick up the work items and
|
| - // become busy.
|
| - Timer timer(true);
|
| - while (timer.GetMilliseconds() < kTimeToWaitForDownloadsMs) {
|
| - if (download_manager_->IsBusy()) {
|
| - break;
|
| - }
|
| - }
|
| - timer.Reset();
|
| -
|
| - // Wait for the download manager to exit its busy state.
|
| - timer.Start();
|
| - while (download_manager_->IsBusy() &&
|
| - timer.GetMilliseconds() < kTimeToWaitForDownloadsMs) {
|
| - ::Sleep(kTimeToSleepWhenPollingMs);
|
| - }
|
| -
|
| - // Expect that downloads have completed in a reasonable time.
|
| - EXPECT_FALSE(download_manager_->IsBusy());
|
| -
|
| - // Test the outcome of the two downloads.
|
| - app = app_bundle_->GetApp(0);
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - app = app_bundle_->GetApp(1);
|
| - package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData1.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBin1Hash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Try to cancel the downloads if they could not complete in time and the
|
| - // download manager is still busy. The thread pool waits a while for the work
|
| - // items to complete after they have been canceled.
|
| - if (download_manager_->IsBusy()) {
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - download_manager_->Cancel(app_bundle_->GetApp(i));
|
| - }
|
| - return;
|
| - }
|
| -}
|
| -
|
| -// Downloads multiple apps concurrently and cancels the downloads while they
|
| -// are in progress. The test builds a bundle of two apps with one file each,
|
| -// creates two thread pool work items to download the apps, waits for the
|
| -// downloads to begin, and then cancels them.
|
| -// TODO(omaha): Fix the intermittent failures.
|
| -TEST_F(DownloadManagerUserTest, DISABLED_DownloadApp_Cancel) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid2), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App2"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Two apps, one package each.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/dl/edgedl/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"jCBqGodZn1Ms5oZ1U28LFUaQDXo=\" "
|
| - "name=\"UpdateData_10M.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"10485760\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "<app appid=\"{C7F2B395-A01C-4806-AA07-9163F66AFC48}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/dl/edgedl/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"2.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"jCBqGodZn1Ms5oZ1U28LFUaQDXo=\" "
|
| - "name=\"UpdateData_10M.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"10485760\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| -
|
| - // The thread pool waits up to 1 minute for the work items to complete when
|
| - // the thread pool object is destroyed.
|
| - const int kShutdownDelayMs = 60000;
|
| -
|
| - ThreadPool thread_pool;
|
| - ASSERT_HRESULT_SUCCEEDED(thread_pool.Initialize(kShutdownDelayMs));
|
| -
|
| - const int kNumApps = 2;
|
| -
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - app = app_bundle_->GetApp(i);
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - scoped_ptr<DownloadAppWorkItem> work_item(
|
| - new DownloadAppWorkItem(download_manager_.get(), app));
|
| -
|
| - ASSERT_HRESULT_SUCCEEDED(thread_pool.QueueUserWorkItem(
|
| - work_item.release(),
|
| - WT_EXECUTELONGFUNCTION));
|
| - }
|
| -
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - app = app_bundle_->GetApp(i);
|
| - EXPECT_NE(STATE_ERROR, app->state());
|
| - }
|
| -
|
| - // Poll the state of the download manager and wait up to 1 minute for the
|
| - // downloads to complete.
|
| - const int kTimeToWaitForDownloadsMs = 60000;
|
| - const int kTimeToSleepWhenPollingMs = 10;
|
| -
|
| - // Cancel the downloads as soon as all apps are downloading and
|
| - // wait until all apps have transitioned in the error state.
|
| - Timer timer(true);
|
| - bool is_done = false;
|
| - while (!is_done && timer.GetMilliseconds() < kTimeToWaitForDownloadsMs) {
|
| - int num_apps_downloading = 0;
|
| -
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - app = app_bundle_->GetApp(i);
|
| - if (app->state() == STATE_DOWNLOADING) {
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - if (package->bytes_downloaded()) {
|
| - ++num_apps_downloading;
|
| - }
|
| - }
|
| - }
|
| -
|
| - is_done = (num_apps_downloading == kNumApps);
|
| -
|
| - ::Sleep(kTimeToSleepWhenPollingMs);
|
| - }
|
| -
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - download_manager_->Cancel(app_bundle_->GetApp(i));
|
| - }
|
| -
|
| - is_done = false;
|
| - while (!is_done && timer.GetMilliseconds() < kTimeToWaitForDownloadsMs) {
|
| - int num_apps_cancelled = 0;
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - app = app_bundle_->GetApp(i);
|
| - if (app->state() == STATE_ERROR) {
|
| - ++num_apps_cancelled;
|
| - }
|
| - }
|
| -
|
| - is_done = (num_apps_cancelled == kNumApps);
|
| -
|
| - ::Sleep(kTimeToSleepWhenPollingMs);
|
| - }
|
| -
|
| - for (int i = 0; i != kNumApps; ++i) {
|
| - // Check the state of the app and the package after the cancel call.
|
| - app = app_bundle_->GetApp(i);
|
| - EXPECT_EQ(STATE_ERROR, app->state());
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_LT(0, package->bytes_downloaded());
|
| - VARIANT_BOOL is_available(false);
|
| - EXPECT_HRESULT_SUCCEEDED(package->get_isAvailable(&is_available));
|
| - EXPECT_FALSE(is_available);
|
| -
|
| - // Check CurrentAppState members.
|
| - CComPtr<IDispatch> current_state_disp;
|
| - EXPECT_HRESULT_SUCCEEDED(app->get_currentState(¤t_state_disp));
|
| - CComPtr<ICurrentState> current_state;
|
| - EXPECT_HRESULT_SUCCEEDED(
|
| - current_state_disp->QueryInterface(¤t_state));
|
| -
|
| - LONG state_value = 0;
|
| - EXPECT_HRESULT_SUCCEEDED(current_state->get_stateValue(&state_value));
|
| - EXPECT_EQ(STATE_ERROR, static_cast<CurrentState>(state_value));
|
| -
|
| - LONG error_code = 0;
|
| - EXPECT_HRESULT_SUCCEEDED(current_state->get_errorCode(&error_code));
|
| - EXPECT_EQ(GOOPDATE_E_CANCELLED, error_code);
|
| -
|
| - LONG extra_code1 = 0;
|
| - EXPECT_HRESULT_SUCCEEDED(current_state->get_errorCode(&extra_code1));
|
| - EXPECT_EQ(0, extra_code1);
|
| - }
|
| -}
|
| -
|
| -// Common packages of different apps are not cached by the package cache and
|
| -// will be redownloaded until the network cache is implemented.
|
| -// TODO(omaha): fix unit test as soon as the network cache is implemented.
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_MultipleAppsCommonPackage) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid2), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App2"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Two apps, same package each.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "<app appid=\"{C7F2B395-A01C-4806-AA07-9163F66AFC48}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"2.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| -
|
| - // Tests the first app.
|
| - app = app_bundle_->GetApp(0);
|
| - ASSERT_TRUE(app);
|
| - SetAppStateWaitingToDownload(app);
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Tests the second app. The package is redownloaded.
|
| - app = app_bundle_->GetApp(1);
|
| - ASSERT_TRUE(app);
|
| - SetAppStateWaitingToDownload(app);
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -// Creates two bundles with the same app. The package corresponding to the
|
| -// app in the second bundle must come from the cache.
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_FileAlreadyInCache) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - // Tests the package and the bytes downloaded.
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Create the second app bundle.
|
| - shared_ptr<AppBundle> app_bundle2(model_->CreateAppBundle(false));
|
| - EXPECT_SUCCEEDED(app_bundle2->put_displayName(CComBSTR(_T("My Bundle"))));
|
| - EXPECT_SUCCEEDED(app_bundle2->put_displayLanguage(CComBSTR(_T("en"))));
|
| - EXPECT_SUCCEEDED(app_bundle2->initialize());
|
| -
|
| - app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle2->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - // Since the package is cached, it does not matter if the EULA is accepted.
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_FALSE));
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle2.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| -
|
| - // Tests the package and the bytes downloaded.
|
| - package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| -
|
| - // No bytes are downloaded if the package has been cached already.
|
| - EXPECT_EQ(0, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_404) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("404 Test"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"NoSuchFile-OmahaTest.exe\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_EQ(GOOPDATE_E_NETWORK_FIRST + 404,
|
| - download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("NoSuchFile-OmahaTest.exe"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(0, package->bytes_downloaded());
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_HashFailure) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("Hash Fail"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Provides the wrong hash for the package.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"tbYInfmArVRUD62Ex292vN4LtGQ=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_EQ(SIGS_E_INVALID_SIGNATURE,
|
| - download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBin1Hash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // All bytes were downloaded even if the validation of the file has failed.
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_HashFailure_ActualSmaller) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("Hash Fail"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Provides the wrong hash for the package.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"tbYInfmArVRUD62Ex292vN4LtGQ=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048000\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_EQ(GOOPDATEDOWNLOAD_E_FILE_SIZE_SMALLER,
|
| - download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048000, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBin1Hash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Actual bytes were downloaded even if the validation of the file has failed.
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_HashFailure_ActualLarger) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("Hash Fail"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Provides the wrong hash for the package.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"tbYInfmArVRUD62Ex292vN4LtGQ=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"20\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_EQ(GOOPDATEDOWNLOAD_E_FILE_SIZE_LARGER,
|
| - download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(20, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBin1Hash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Actual bytes were downloaded even if the validation of the file has failed
|
| - // or expected a smaller file.
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_BaseUrlFallback) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("Hash Fail"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // Provides the wrong hash for the package.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/TEST_NOT_EXIST/\"/>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_FallbackToNextUrlIfCachingFails) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(
|
| - app->put_displayName(CComBSTR(_T("Hash Fails For First Url"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // First URL points to a corrupted file.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/test/fakedata/\"/>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(2048, package->bytes_downloaded());
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, DownloadApp_EulaNotAccepted) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| -
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_FALSE));
|
| -
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - ExpectAsserts expect_asserts; // Eula not accepted causes asserts.
|
| -
|
| - EXPECT_EQ(GOOPDATE_E_APP_UPDATE_DISABLED_EULA_NOT_ACCEPTED,
|
| - download_manager_->DownloadApp(app));
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| - EXPECT_STREQ(_T("UpdateData.bin"), package->filename());
|
| - EXPECT_EQ(2048, package->expected_size());
|
| - EXPECT_STREQ(kUpdateBinHash, package->expected_hash());
|
| - EXPECT_EQ(0, package->bytes_downloaded());
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, GetPackage) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| - EXPECT_SUCCEEDED(app->put_isEulaAccepted(VARIANT_TRUE)); // Allow download.
|
| -
|
| - // One app, one package.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| -
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| - EXPECT_SUCCEEDED(download_manager_->DownloadApp(app));
|
| - EXPECT_TRUE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Get a unique temp dir name. The directory is not created.
|
| - CString dir(GetUniqueTempDirectoryName());
|
| -
|
| - // The call fails if the package destination directory does not exist.
|
| - EXPECT_FAILED(download_manager_->GetPackage(package, dir));
|
| -
|
| - EXPECT_SUCCEEDED(CreateDir(dir, NULL));
|
| - EXPECT_SUCCEEDED(download_manager_->GetPackage(package, dir));
|
| -
|
| - CString filename(ConcatenatePath(dir, package->filename()));
|
| - std::vector<CString> files;
|
| - files.push_back(filename);
|
| - EXPECT_SUCCEEDED(AuthenticateFiles(files, kUpdateBinHash));
|
| -
|
| - // Getting the package the second time overwrites the destination file
|
| - // and succeeds.
|
| - EXPECT_SUCCEEDED(download_manager_->GetPackage(package, dir));
|
| -
|
| - EXPECT_SUCCEEDED(DeleteDirectory(dir));
|
| -}
|
| -
|
| -TEST_F(DownloadManagerUserTest, GetPackage_NotPresent) {
|
| - App* app = NULL;
|
| - ASSERT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kAppGuid1), &app));
|
| - EXPECT_SUCCEEDED(app->put_displayName(CComBSTR(_T("App1"))));
|
| -
|
| - // One app, one package.
|
| - CStringA buffer_string =
|
| -
|
| - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
| - "<response protocol=\"3.0\">"
|
| - "<app appid=\"{0B35E146-D9CB-4145-8A91-43FDCAEBCD1E}\" status=\"ok\">"
|
| - "<updatecheck status=\"ok\">"
|
| - "<urls>"
|
| - "<url codebase=\"http://dl.google.com/update2/\"/>"
|
| - "</urls>"
|
| - "<manifest version=\"1.0\">"
|
| - "<packages>"
|
| - "<package "
|
| - "hash=\"YF2z/br/S6E3KTca0MT7qziJN44=\" "
|
| - "name=\"UpdateData.bin\" "
|
| - "required=\"true\" "
|
| - "size=\"2048\"/>"
|
| - "</packages>"
|
| - "</manifest>"
|
| - "</updatecheck>"
|
| - "</app>"
|
| - "</response>";
|
| -
|
| - EXPECT_HRESULT_SUCCEEDED(LoadBundleFromXml(app_bundle_.get(), buffer_string));
|
| - SetAppStateWaitingToDownload(app);
|
| -
|
| - const Package* package = app->next_version()->GetPackage(0);
|
| - ASSERT_TRUE(package);
|
| -
|
| - EXPECT_FALSE(download_manager_->IsPackageAvailable(package));
|
| -
|
| - // Get a unique temp dir name. The directory is not created.
|
| - CString dir(GetUniqueTempDirectoryName());
|
| -
|
| - EXPECT_SUCCEEDED(CreateDir(dir, NULL));
|
| - EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
|
| - download_manager_->GetPackage(package, dir));
|
| -
|
| - EXPECT_SUCCEEDED(DeleteDirectory(dir));
|
| -}
|
| -
|
| -TEST(DownloadManagerTest, BuildUniqueFileName) {
|
| - CString file1, file2;
|
| - EXPECT_SUCCEEDED(DownloadManagerTest::BuildUniqueFileName(_T("a"), &file1));
|
| - EXPECT_SUCCEEDED(DownloadManagerTest::BuildUniqueFileName(_T("a"), &file2));
|
| - EXPECT_STRNE(file1, file2);
|
| -}
|
| -
|
| -TEST(DownloadManagerTest, GetMessageForError) {
|
| - const TCHAR* kEnglish = _T("en");
|
| - EXPECT_SUCCEEDED(ResourceManager::Create(
|
| - true, app_util::GetCurrentModuleDirectory(), kEnglish));
|
| -
|
| - EXPECT_STREQ(
|
| - _T("The installer could not connect to the Internet. Ensure that your ")
|
| - _T("computer is connected to the Internet and your firewall allows ")
|
| - _T("GoogleUpdate.exe to connect then try again."),
|
| - DownloadManager::GetMessageForError(
|
| - ErrorContext(GOOPDATE_E_NO_NETWORK), kEnglish));
|
| -
|
| - EXPECT_STREQ(
|
| - _T("The installer could not connect to the Internet because of ")
|
| - _T("an HTTP 401 Unauthorized response. This is likely a proxy ")
|
| - _T("configuration issue. Please configure the proxy server to allow ")
|
| - _T("network access and try again or contact your network administrator."),
|
| - DownloadManager::GetMessageForError(
|
| - ErrorContext(GOOPDATE_E_NETWORK_UNAUTHORIZED), kEnglish));
|
| -
|
| - EXPECT_STREQ(
|
| - _T("The installer could not connect to the Internet because of ")
|
| - _T("an HTTP 403 Forbidden response. This is likely a proxy ")
|
| - _T("configuration issue. Please configure the proxy server to allow ")
|
| - _T("network access and try again or contact your network administrator."),
|
| - DownloadManager::GetMessageForError(
|
| - ErrorContext(GOOPDATE_E_NETWORK_FORBIDDEN), kEnglish));
|
| -
|
| - EXPECT_STREQ(
|
| - _T("The installer could not connect to the Internet because a ")
|
| - _T("proxy server required user authentication. Please configure the ")
|
| - _T("proxy server to allow network access and try again or contact your ")
|
| - _T("network administrator."),
|
| - DownloadManager::GetMessageForError(
|
| - ErrorContext(GOOPDATE_E_NETWORK_PROXYAUTHREQUIRED),
|
| - kEnglish));
|
| -
|
| - EXPECT_STREQ(
|
| - _T("The download failed."),
|
| - DownloadManager::GetMessageForError(ErrorContext(E_FAIL), kEnglish));
|
| -
|
| - EXPECT_STREQ(
|
| - _T("Failed to cache the downloaded installer. Error: 0x80070005."),
|
| - DownloadManager::GetMessageForError(
|
| - ErrorContext(GOOPDATEDOWNLOAD_E_CACHING_FAILED, 0x80070005),
|
| - kEnglish));
|
| -
|
| - ResourceManager::Delete();
|
| -}
|
| -
|
| -} // namespace omaha
|
|
|