| Index: chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc
|
| diff --git a/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc b/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc
|
| deleted file mode 100644
|
| index 57a3b70246bec5c34bf3008cecb00e95b7af9980..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc
|
| +++ /dev/null
|
| @@ -1,649 +0,0 @@
|
| -// Copyright 2016 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/android/offline_pages/background_loader_offliner.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/test/histogram_tester.h"
|
| -#include "base/test/scoped_feature_list.h"
|
| -#include "base/test/scoped_mock_time_message_loop_task_runner.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "chrome/browser/android/offline_pages/offliner_helper.h"
|
| -#include "chrome/browser/net/prediction_options.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/test/base/testing_profile.h"
|
| -#include "components/content_settings/core/common/pref_names.h"
|
| -#include "components/offline_pages/content/background_loader/background_loader_contents_stub.h"
|
| -#include "components/offline_pages/core/background/offliner.h"
|
| -#include "components/offline_pages/core/background/offliner_policy.h"
|
| -#include "components/offline_pages/core/background/save_page_request.h"
|
| -#include "components/offline_pages/core/offline_page_feature.h"
|
| -#include "components/offline_pages/core/stub_offline_page_model.h"
|
| -#include "components/prefs/pref_service.h"
|
| -#include "content/public/browser/mhtml_extra_parts.h"
|
| -#include "content/public/browser/navigation_handle.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "content/public/test/web_contents_tester.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace offline_pages {
|
| -
|
| -namespace {
|
| -
|
| -const int64_t kRequestId = 7;
|
| -const GURL kHttpUrl("http://www.tunafish.com");
|
| -const GURL kFileUrl("file://salmon.png");
|
| -const ClientId kClientId("async_loading", "88");
|
| -const bool kUserRequested = true;
|
| -
|
| -// Mock OfflinePageModel for testing the SavePage calls
|
| -class MockOfflinePageModel : public StubOfflinePageModel {
|
| - public:
|
| - MockOfflinePageModel() : mock_saving_(false), mock_deleting_(false) {}
|
| - ~MockOfflinePageModel() override {}
|
| -
|
| - void SavePage(const SavePageParams& save_page_params,
|
| - std::unique_ptr<OfflinePageArchiver> archiver,
|
| - const SavePageCallback& callback) override {
|
| - mock_saving_ = true;
|
| - save_page_callback_ = callback;
|
| - }
|
| -
|
| - void CompleteSavingAsArchiveCreationFailed() {
|
| - DCHECK(mock_saving_);
|
| - mock_saving_ = false;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(save_page_callback_,
|
| - SavePageResult::ARCHIVE_CREATION_FAILED, 0));
|
| - }
|
| -
|
| - void CompleteSavingAsSuccess() {
|
| - DCHECK(mock_saving_);
|
| - mock_saving_ = false;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(save_page_callback_, SavePageResult::SUCCESS, 123456));
|
| - }
|
| -
|
| - void CompleteSavingAsAlreadyExists() {
|
| - DCHECK(mock_saving_);
|
| - mock_saving_ = false;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(save_page_callback_,
|
| - SavePageResult::ALREADY_EXISTS, 123456));
|
| - }
|
| -
|
| - void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids,
|
| - const DeletePageCallback& callback) override {
|
| - mock_deleting_ = true;
|
| - callback.Run(DeletePageResult::SUCCESS);
|
| - }
|
| -
|
| - bool mock_saving() const { return mock_saving_; }
|
| - bool mock_deleting() const { return mock_deleting_; }
|
| -
|
| - private:
|
| - bool mock_saving_;
|
| - bool mock_deleting_;
|
| - SavePageCallback save_page_callback_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockOfflinePageModel);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -// A BackgroundLoader that we can run tests on.
|
| -// Overrides the ResetState so we don't actually try to create any web contents.
|
| -// This is a temporary solution to test core BackgroundLoaderOffliner
|
| -// functionality until we straighten out assumptions made by RequestCoordinator
|
| -// so that the ResetState method is no longer needed.
|
| -class TestBackgroundLoaderOffliner : public BackgroundLoaderOffliner {
|
| - public:
|
| - explicit TestBackgroundLoaderOffliner(
|
| - content::BrowserContext* browser_context,
|
| - const OfflinerPolicy* policy,
|
| - OfflinePageModel* offline_page_model);
|
| - ~TestBackgroundLoaderOffliner() override;
|
| - content::WebContentsTester* web_contents_tester() {
|
| - return content::WebContentsTester::For(stub_->web_contents());
|
| - }
|
| -
|
| - content::WebContents* web_contents() { return stub_->web_contents(); }
|
| -
|
| - bool is_loading() { return loader_ && stub_->is_loading(); }
|
| -
|
| - protected:
|
| - void ResetLoader() override;
|
| -
|
| - private:
|
| - background_loader::BackgroundLoaderContentsStub* stub_;
|
| -};
|
| -
|
| -TestBackgroundLoaderOffliner::TestBackgroundLoaderOffliner(
|
| - content::BrowserContext* browser_context,
|
| - const OfflinerPolicy* policy,
|
| - OfflinePageModel* offline_page_model)
|
| - : BackgroundLoaderOffliner(browser_context, policy, offline_page_model) {}
|
| -
|
| -TestBackgroundLoaderOffliner::~TestBackgroundLoaderOffliner() {}
|
| -
|
| -void TestBackgroundLoaderOffliner::ResetLoader() {
|
| - stub_ = new background_loader::BackgroundLoaderContentsStub(browser_context_);
|
| - loader_.reset(stub_);
|
| -}
|
| -
|
| -class BackgroundLoaderOfflinerTest : public testing::Test {
|
| - public:
|
| - BackgroundLoaderOfflinerTest();
|
| - ~BackgroundLoaderOfflinerTest() override;
|
| -
|
| - void SetUp() override;
|
| -
|
| - TestBackgroundLoaderOffliner* offliner() const { return offliner_.get(); }
|
| - Offliner::CompletionCallback const completion_callback() {
|
| - return base::Bind(&BackgroundLoaderOfflinerTest::OnCompletion,
|
| - base::Unretained(this));
|
| - }
|
| - Offliner::ProgressCallback const progress_callback() {
|
| - return base::Bind(&BackgroundLoaderOfflinerTest::OnProgress,
|
| - base::Unretained(this));
|
| - }
|
| - Offliner::CancelCallback const cancel_callback() {
|
| - return base::Bind(&BackgroundLoaderOfflinerTest::OnCancel,
|
| - base::Unretained(this));
|
| - }
|
| - Profile* profile() { return &profile_; }
|
| - bool completion_callback_called() { return completion_callback_called_; }
|
| - Offliner::RequestStatus request_status() { return request_status_; }
|
| - bool cancel_callback_called() { return cancel_callback_called_; }
|
| - bool SaveInProgress() const { return model_->mock_saving(); }
|
| - bool DeleteCalled() const { return model_->mock_deleting(); }
|
| - MockOfflinePageModel* model() const { return model_; }
|
| - const base::HistogramTester& histograms() const { return histogram_tester_; }
|
| - int64_t progress() { return progress_; }
|
| - OfflinerPolicy* policy() const { return policy_.get(); }
|
| -
|
| - void PumpLoop() { base::RunLoop().RunUntilIdle(); }
|
| -
|
| - void CompleteLoading() {
|
| - // Reset snapshot controller.
|
| - std::unique_ptr<SnapshotController> snapshot_controller(
|
| - new SnapshotController(base::ThreadTaskRunnerHandle::Get(),
|
| - offliner_.get(),
|
| - 0L /* DelayAfterDocumentAvailable */,
|
| - 0L /* DelayAfterDocumentOnLoad */,
|
| - false /* DocumentAvailableTriggersSnapshot */));
|
| - offliner_->SetSnapshotControllerForTest(std::move(snapshot_controller));
|
| - // Call complete loading.
|
| - offliner()->DocumentOnLoadCompletedInMainFrame();
|
| - PumpLoop();
|
| - }
|
| -
|
| - private:
|
| - void OnCompletion(const SavePageRequest& request,
|
| - Offliner::RequestStatus status);
|
| - void OnProgress(const SavePageRequest& request, int64_t bytes);
|
| - void OnCancel(const SavePageRequest& request);
|
| - content::TestBrowserThreadBundle thread_bundle_;
|
| - TestingProfile profile_;
|
| - std::unique_ptr<OfflinerPolicy> policy_;
|
| - std::unique_ptr<TestBackgroundLoaderOffliner> offliner_;
|
| - MockOfflinePageModel* model_;
|
| - bool completion_callback_called_;
|
| - bool cancel_callback_called_;
|
| - int64_t progress_;
|
| - Offliner::RequestStatus request_status_;
|
| - base::HistogramTester histogram_tester_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BackgroundLoaderOfflinerTest);
|
| -};
|
| -
|
| -BackgroundLoaderOfflinerTest::BackgroundLoaderOfflinerTest()
|
| - : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
|
| - completion_callback_called_(false),
|
| - cancel_callback_called_(false),
|
| - progress_(0LL),
|
| - request_status_(Offliner::RequestStatus::UNKNOWN) {}
|
| -
|
| -BackgroundLoaderOfflinerTest::~BackgroundLoaderOfflinerTest() {}
|
| -
|
| -void BackgroundLoaderOfflinerTest::SetUp() {
|
| - model_ = new MockOfflinePageModel();
|
| - policy_.reset(new OfflinerPolicy());
|
| - offliner_.reset(
|
| - new TestBackgroundLoaderOffliner(profile(), policy_.get(), model_));
|
| -}
|
| -
|
| -void BackgroundLoaderOfflinerTest::OnCompletion(
|
| - const SavePageRequest& request,
|
| - Offliner::RequestStatus status) {
|
| - DCHECK(!completion_callback_called_); // Expect 1 callback per request.
|
| - completion_callback_called_ = true;
|
| - request_status_ = status;
|
| -}
|
| -
|
| -void BackgroundLoaderOfflinerTest::OnProgress(const SavePageRequest& request,
|
| - int64_t bytes) {
|
| - progress_ = bytes;
|
| -}
|
| -
|
| -void BackgroundLoaderOfflinerTest::OnCancel(const SavePageRequest& request) {
|
| - DCHECK(!cancel_callback_called_);
|
| - cancel_callback_called_ = true;
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest,
|
| - LoadAndSaveBlockThirdPartyCookiesForCustomTabs) {
|
| - base::Time creation_time = base::Time::Now();
|
| - ClientId custom_tabs_client_id("custom_tabs", "88");
|
| - SavePageRequest request(kRequestId, kHttpUrl, custom_tabs_client_id,
|
| - creation_time, kUserRequested);
|
| -
|
| - profile()->GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
|
| - EXPECT_FALSE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - histograms().ExpectBucketCount(
|
| - "OfflinePages.Background.CctApiDisableStatus",
|
| - static_cast<int>(OfflinePagesCctApiPrerenderAllowedStatus::
|
| - THIRD_PARTY_COOKIES_DISABLED),
|
| - 1);
|
| - histograms().ExpectBucketCount("OfflinePages.Background.CctApiDisableStatus",
|
| - 0 /* PRERENDER_ALLOWED */, 0);
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest,
|
| - LoadAndSaveNetworkPredictionDisabledForCustomTabs) {
|
| - base::Time creation_time = base::Time::Now();
|
| - ClientId custom_tabs_client_id("custom_tabs", "88");
|
| - SavePageRequest request(kRequestId, kHttpUrl, custom_tabs_client_id,
|
| - creation_time, kUserRequested);
|
| -
|
| - profile()->GetPrefs()->SetInteger(
|
| - prefs::kNetworkPredictionOptions,
|
| - chrome_browser_net::NETWORK_PREDICTION_NEVER);
|
| - EXPECT_FALSE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - histograms().ExpectBucketCount(
|
| - "OfflinePages.Background.CctApiDisableStatus",
|
| - static_cast<int>(OfflinePagesCctApiPrerenderAllowedStatus::
|
| - NETWORK_PREDICTION_DISABLED),
|
| - 1);
|
| - histograms().ExpectBucketCount(
|
| - "OfflinePages.Background.CctApiDisableStatus",
|
| - static_cast<int>(
|
| - OfflinePagesCctApiPrerenderAllowedStatus::PRERENDER_ALLOWED),
|
| - 0);
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, LoadAndSaveStartsLoading) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - EXPECT_TRUE(offliner()->is_loading());
|
| - EXPECT_FALSE(SaveInProgress());
|
| - EXPECT_FALSE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, BytesReportedWillUpdateProgress) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - offliner()->OnNetworkBytesChanged(5LL);
|
| - EXPECT_EQ(progress(), 5LL);
|
| - offliner()->OnNetworkBytesChanged(10LL);
|
| - EXPECT_EQ(progress(), 15LL);
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, CompleteLoadingInitiatesSave) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - EXPECT_FALSE(completion_callback_called());
|
| - EXPECT_TRUE(SaveInProgress());
|
| - EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, CancelWhenLoading) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - offliner()->Cancel(cancel_callback());
|
| - PumpLoop();
|
| - offliner()->OnNetworkBytesChanged(15LL);
|
| - EXPECT_TRUE(cancel_callback_called());
|
| - EXPECT_FALSE(offliner()->is_loading()); // Offliner reset.
|
| - EXPECT_EQ(progress(), 0LL); // network bytes not recorded when not busy.
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, CancelWhenLoaded) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - offliner()->Cancel(cancel_callback());
|
| - PumpLoop();
|
| -
|
| - // Subsequent save callback cause no crash.
|
| - model()->CompleteSavingAsArchiveCreationFailed();
|
| - PumpLoop();
|
| - EXPECT_TRUE(cancel_callback_called());
|
| - EXPECT_TRUE(DeleteCalled());
|
| - EXPECT_FALSE(completion_callback_called());
|
| - EXPECT_FALSE(SaveInProgress());
|
| - EXPECT_FALSE(offliner()->is_loading()); // Offliner reset.
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, LoadedButSaveFails) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - model()->CompleteSavingAsArchiveCreationFailed();
|
| - PumpLoop();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::SAVE_FAILED, request_status());
|
| - EXPECT_FALSE(offliner()->is_loading());
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, ProgressDoesNotUpdateDuringSave) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - offliner()->OnNetworkBytesChanged(10LL);
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - offliner()->OnNetworkBytesChanged(15LL);
|
| - EXPECT_EQ(progress(), 10LL);
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, LoadAndSaveSuccess) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - model()->CompleteSavingAsSuccess();
|
| - PumpLoop();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::SAVED, request_status());
|
| - EXPECT_FALSE(offliner()->is_loading());
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, LoadAndSaveAlreadyExists) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - model()->CompleteSavingAsAlreadyExists();
|
| - PumpLoop();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::SAVED, request_status());
|
| - EXPECT_FALSE(offliner()->is_loading());
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, FailsOnInvalidURL) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kFileUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_FALSE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, ReturnsOnRenderCrash) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - offliner()->RenderProcessGone(
|
| - base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED);
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED_NO_NEXT, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, ReturnsOnRenderKilled) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - offliner()->RenderProcessGone(
|
| - base::TerminationStatus::TERMINATION_STATUS_PROCESS_WAS_KILLED);
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, ReturnsOnWebContentsDestroyed) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - offliner()->WebContentsDestroyed();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, FailsOnErrorPage) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - // Create handle with net error code.
|
| - // Called after calling LoadAndSave so we have web_contents to work with.
|
| - std::unique_ptr<content::NavigationHandle> handle(
|
| - content::NavigationHandle::CreateNavigationHandleForTesting(
|
| - kHttpUrl, offliner()->web_contents()->GetMainFrame(), true,
|
| - net::Error::ERR_NAME_NOT_RESOLVED));
|
| - // NavigationHandle destruction will trigger DidFinishNavigation code.
|
| - handle.reset();
|
| - histograms().ExpectBucketCount(
|
| - "OfflinePages.Background.BackgroundLoadingFailedCode.async_loading",
|
| - 105, // ERR_NAME_NOT_RESOLVED
|
| - 1);
|
| - CompleteLoading();
|
| - PumpLoop();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, NoNextOnInternetDisconnected) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -
|
| - // Create handle with net error code.
|
| - // Called after calling LoadAndSave so we have web_contents to work with.
|
| - std::unique_ptr<content::NavigationHandle> handle(
|
| - content::NavigationHandle::CreateNavigationHandleForTesting(
|
| - kHttpUrl, offliner()->web_contents()->GetMainFrame(), true,
|
| - net::Error::ERR_INTERNET_DISCONNECTED));
|
| - // Call DidFinishNavigation with handle that contains error.
|
| - offliner()->DidFinishNavigation(handle.get());
|
| - // NavigationHandle is always destroyed after finishing navigation.
|
| - handle.reset();
|
| - CompleteLoading();
|
| - PumpLoop();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED_NO_NEXT, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, OnlySavesOnceOnMultipleLoads) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - // First load
|
| - CompleteLoading();
|
| - // Second load
|
| - CompleteLoading();
|
| - PumpLoop();
|
| - model()->CompleteSavingAsSuccess();
|
| - PumpLoop();
|
| -
|
| - EXPECT_TRUE(completion_callback_called());
|
| - EXPECT_EQ(Offliner::RequestStatus::SAVED, request_status());
|
| - EXPECT_FALSE(offliner()->is_loading());
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, HandleTimeoutWithLowBarStartedTriesMet) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - request.set_started_attempt_count(policy()->GetMaxStartedTries() - 1);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - // Guarantees low bar for saving is met.
|
| - offliner()->DocumentAvailableInMainFrame();
|
| - // Timeout
|
| - EXPECT_TRUE(offliner()->HandleTimeout(kRequestId));
|
| - EXPECT_TRUE(SaveInProgress());
|
| - model()->CompleteSavingAsSuccess();
|
| - PumpLoop();
|
| - EXPECT_EQ(Offliner::RequestStatus::SAVED_ON_LAST_RETRY, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, HandleTimeoutWithLowBarCompletedTriesMet) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - request.set_completed_attempt_count(policy()->GetMaxCompletedTries() - 1);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - // Guarantees low bar for saving is met.
|
| - offliner()->DocumentAvailableInMainFrame();
|
| - // Timeout
|
| - EXPECT_TRUE(offliner()->HandleTimeout(kRequestId));
|
| - EXPECT_TRUE(SaveInProgress());
|
| - model()->CompleteSavingAsSuccess();
|
| - PumpLoop();
|
| - EXPECT_EQ(Offliner::RequestStatus::SAVED_ON_LAST_RETRY, request_status());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, HandleTimeoutWithNoLowBarStartedTriesMet) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - request.set_started_attempt_count(policy()->GetMaxStartedTries() - 1);
|
| - // Timeout
|
| - EXPECT_FALSE(offliner()->HandleTimeout(kRequestId));
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest,
|
| - HandleTimeoutWithNoLowBarCompletedTriesMet) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - request.set_completed_attempt_count(policy()->GetMaxCompletedTries() - 1);
|
| - // Timeout
|
| - EXPECT_FALSE(offliner()->HandleTimeout(kRequestId));
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, HandleTimeoutWithLowBarNoRetryLimit) {
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| - // Sets lowbar.
|
| - offliner()->DocumentAvailableInMainFrame();
|
| - // Timeout
|
| - EXPECT_FALSE(offliner()->HandleTimeout(kRequestId));
|
| - EXPECT_FALSE(SaveInProgress());
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, SignalCollectionDisabled) {
|
| - // Ensure feature flag for Signal collection is off,
|
| - EXPECT_FALSE(offline_pages::IsOfflinePagesLoadSignalCollectingEnabled());
|
| -
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -
|
| - CompleteLoading();
|
| - PumpLoop();
|
| -
|
| - // No extra parts should be added if the flag is off.
|
| - content::MHTMLExtraParts* extra_parts =
|
| - content::MHTMLExtraParts::FromWebContents(offliner()->web_contents());
|
| - EXPECT_EQ(extra_parts->size(), 0);
|
| -}
|
| -
|
| -TEST_F(BackgroundLoaderOfflinerTest, SignalCollectionEnabled) {
|
| - // Ensure feature flag for signal collection is on.
|
| - base::test::ScopedFeatureList scoped_feature_list;
|
| - scoped_feature_list.InitAndEnableFeature(
|
| - kOfflinePagesLoadSignalCollectingFeature);
|
| - EXPECT_TRUE(IsOfflinePagesLoadSignalCollectingEnabled());
|
| -
|
| - base::Time creation_time = base::Time::Now();
|
| - SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
|
| - kUserRequested);
|
| - EXPECT_TRUE(offliner()->LoadAndSave(request, completion_callback(),
|
| - progress_callback()));
|
| -
|
| - CompleteLoading();
|
| - PumpLoop();
|
| -
|
| - // One extra part should be added if the flag is on.
|
| - content::MHTMLExtraParts* extra_parts =
|
| - content::MHTMLExtraParts::FromWebContents(offliner()->web_contents());
|
| - EXPECT_EQ(extra_parts->size(), 1);
|
| -}
|
| -
|
| -} // namespace offline_pages
|
|
|