| Index: chrome/browser/android/offline_pages/offline_page_request_job_unittest.cc
|
| diff --git a/chrome/browser/android/offline_pages/offline_page_request_job_unittest.cc b/chrome/browser/android/offline_pages/offline_page_request_job_unittest.cc
|
| index 315f72f024268eaf914f9e66724fd64f9752ac44..e929e3924efc0737f7f2cf1dcb704c2b31c6e46b 100644
|
| --- a/chrome/browser/android/offline_pages/offline_page_request_job_unittest.cc
|
| +++ b/chrome/browser/android/offline_pages/offline_page_request_job_unittest.cc
|
| @@ -231,20 +231,22 @@ class OfflinePageRequestJobTest : public testing::Test {
|
|
|
| void SimulateHasNetworkConnectivity(bool has_connectivity);
|
| void RunUntilIdle();
|
|
|
| void InterceptRequest(const GURL& url,
|
| const std::string& method,
|
| const std::string& extra_header_name,
|
| const std::string& extra_header_value,
|
| content::ResourceType resource_type);
|
|
|
| + void VerifyInfo(bool should_use_offline, int64_t offline_id);
|
| +
|
| void ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult result);
|
|
|
| net::TestURLRequestContext* url_request_context() {
|
| return test_url_request_context_.get();
|
| }
|
| Profile* profile() { return profile_; }
|
| OfflinePageTabHelper* offline_page_tab_helper() const {
|
| return offline_page_tab_helper_;
|
| }
|
| @@ -264,20 +266,21 @@ class OfflinePageRequestJobTest : public testing::Test {
|
| content::ResourceType resource_type);
|
| void ReadCompleted(int bytes_read);
|
|
|
| // Runs on IO thread.
|
| void InterceptRequestOnIO(const GURL& url,
|
| const std::string& method,
|
| const std::string& extra_header_name,
|
| const std::string& extra_header_value,
|
| content::ResourceType resource_type);
|
| void ReadCompletedOnIO(int bytes_read);
|
| + void VerifyInfoOnIO(bool should_use_offline, int64_t offline_id);
|
|
|
| content::TestBrowserThreadBundle thread_bundle_;
|
| base::SimpleTestClock clock_;
|
| std::unique_ptr<TestNetworkChangeNotifier> network_change_notifier_;
|
| std::unique_ptr<net::TestURLRequestContext> test_url_request_context_;
|
| net::URLRequestJobFactoryImpl url_request_job_factory_;
|
| std::unique_ptr<net::URLRequestInterceptingJobFactory>
|
| intercepting_job_factory_;
|
| std::unique_ptr<TestURLRequestDelegate> url_request_delegate_;
|
| std::unique_ptr<TestPreviewsDecider> test_previews_decider_;
|
| @@ -466,20 +469,41 @@ void OfflinePageRequestJobTest::InterceptRequest(
|
| content::ResourceType resource_type) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
|
|
| content::BrowserThread::PostTask(
|
| content::BrowserThread::IO, FROM_HERE,
|
| base::Bind(&OfflinePageRequestJobTest::InterceptRequestOnIO,
|
| base::Unretained(this), url, method, extra_header_name,
|
| extra_header_value, resource_type));
|
| }
|
|
|
| +void OfflinePageRequestJobTest::VerifyInfoOnIO(bool should_use_offline,
|
| + int64_t offline_id) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + EXPECT_EQ(should_use_offline, !!LoadedOfflinePageInfo::GetInfo(*request_));
|
| + if (should_use_offline) {
|
| + EXPECT_EQ(
|
| + offline_id,
|
| + LoadedOfflinePageInfo::GetInfo(*request_)->offline_page()->offline_id);
|
| + }
|
| +}
|
| +
|
| +void OfflinePageRequestJobTest::VerifyInfo(bool should_use_offline,
|
| + int64_t offline_id) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&OfflinePageRequestJobTest::VerifyInfoOnIO,
|
| + base::Unretained(this), should_use_offline, offline_id));
|
| +}
|
| +
|
| void OfflinePageRequestJobTest::ReadCompletedOnIO(int bytes_read) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
|
|
| content::BrowserThread::PostTask(
|
| content::BrowserThread::UI, FROM_HERE,
|
| base::Bind(&OfflinePageRequestJobTest::ReadCompleted,
|
| base::Unretained(this), bytes_read));
|
| }
|
|
|
| void OfflinePageRequestJobTest::ReadCompleted(int bytes_read) {
|
| @@ -491,111 +515,121 @@ void OfflinePageRequestJobTest::ReadCompleted(int bytes_read) {
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, FailedToCreateRequestJob) {
|
| SimulateHasNetworkConnectivity(false);
|
|
|
| // Must be http/https URL.
|
| InterceptRequest(GURL("ftp://host/doc"), "GET", "", "",
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| InterceptRequest(GURL("file:///path/doc"), "GET", "", "",
|
| - content::RESOURCE_TYPE_MAIN_FRAME);
|
| + content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| // Must be GET method.
|
| InterceptRequest(
|
| kTestUrl, "POST", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| InterceptRequest(
|
| kTestUrl, "HEAD", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| // Must be main resource.
|
| InterceptRequest(
|
| kTestUrl, "POST", "", "", content::RESOURCE_TYPE_SUB_FRAME);
|
| base::RunLoop().Run();
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| InterceptRequest(
|
| kTestUrl, "POST", "", "", content::RESOURCE_TYPE_IMAGE);
|
| base::RunLoop().Run();
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, LoadOfflinePageOnDisconnectedNetwork) {
|
| SimulateHasNetworkConnectivity(false);
|
|
|
| InterceptRequest(kTestUrl, "GET", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(kTestFileSize2, bytes_read());
|
| - ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| - EXPECT_EQ(offline_id2(),
|
| - offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
|
| + VerifyInfo(true, offline_id2());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, PageNotFoundOnDisconnectedNetwork) {
|
| SimulateHasNetworkConnectivity(false);
|
|
|
| InterceptRequest(kTestUrl2, "GET", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| PAGE_NOT_FOUND_ON_DISCONNECTED_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, LoadOfflinePageOnProhibitivelySlowNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| test_previews_decider()->set_should_allow_preview(true);
|
|
|
| InterceptRequest(kTestUrl, "GET", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(kTestFileSize2, bytes_read());
|
| - ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| - EXPECT_EQ(offline_id2(),
|
| - offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
|
| + VerifyInfo(true, offline_id2());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| SHOW_OFFLINE_ON_PROHIBITIVELY_SLOW_NETWORK);
|
| test_previews_decider()->set_should_allow_preview(false);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, PageNotFoundOnProhibitivelySlowNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| test_previews_decider()->set_should_allow_preview(true);
|
|
|
| InterceptRequest(kTestUrl2, "GET", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| PAGE_NOT_FOUND_ON_PROHIBITIVELY_SLOW_NETWORK);
|
| test_previews_decider()->set_should_allow_preview(false);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, LoadOfflinePageOnFlakyNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| // When custom offline header exists and contains "reason=error", it means
|
| @@ -603,117 +637,122 @@ TEST_F(OfflinePageRequestJobTest, LoadOfflinePageOnFlakyNetwork) {
|
| InterceptRequest(
|
| kTestUrl,
|
| "GET",
|
| kOfflinePageHeader,
|
| std::string(kOfflinePageHeaderReasonKey) + "=" +
|
| kOfflinePageHeaderReasonValueDueToNetError,
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(kTestFileSize2, bytes_read());
|
| - ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| - EXPECT_EQ(offline_id2(),
|
| - offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
|
| + VerifyInfo(true, offline_id2());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| SHOW_OFFLINE_ON_FLAKY_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, PageNotFoundOnFlakyNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| // When custom offline header exists and contains "reason=error", it means
|
| // that net error is hit in last request due to flaky network.
|
| InterceptRequest(
|
| kTestUrl2,
|
| "GET",
|
| kOfflinePageHeader,
|
| std::string(kOfflinePageHeaderReasonKey) + "=" +
|
| kOfflinePageHeaderReasonValueDueToNetError,
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| PAGE_NOT_FOUND_ON_FLAKY_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, ForceLoadOfflinePageOnConnectedNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| // When custom offline header exists and contains value other than
|
| // "reason=error", it means that offline page is forced to load.
|
| InterceptRequest(
|
| kTestUrl,
|
| "GET",
|
| kOfflinePageHeader,
|
| std::string(kOfflinePageHeaderReasonKey) + "=download",
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(kTestFileSize2, bytes_read());
|
| - ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| - EXPECT_EQ(offline_id2(),
|
| - offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
|
| + VerifyInfo(true, offline_id2());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| SHOW_OFFLINE_ON_CONNECTED_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, PageNotFoundOnConnectedNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| // When custom offline header exists and contains value other than
|
| // "reason=error", it means that offline page is forced to load.
|
| InterceptRequest(
|
| kTestUrl2,
|
| "GET",
|
| kOfflinePageHeader,
|
| std::string(kOfflinePageHeaderReasonKey) + "=download",
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| PAGE_NOT_FOUND_ON_CONNECTED_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, DoNotLoadOfflinePageOnConnectedNetwork) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| InterceptRequest(kTestUrl, "GET", "", "", content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest, LoadOfflinePageByOfflineID) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| InterceptRequest(
|
| kTestUrl,
|
| "GET",
|
| kOfflinePageHeader,
|
| std::string(kOfflinePageHeaderReasonKey) + "=download " +
|
| kOfflinePageHeaderIDKey + "=" + base::Int64ToString(offline_id()),
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(kTestFileSize, bytes_read());
|
| - ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| - EXPECT_EQ(offline_id(),
|
| - offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
|
| + VerifyInfo(true, offline_id());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| SHOW_OFFLINE_ON_CONNECTED_NETWORK);
|
| }
|
|
|
| TEST_F(OfflinePageRequestJobTest,
|
| LoadOfflinePageByOfflineIDAndFallbackToOnlineURL) {
|
| SimulateHasNetworkConnectivity(true);
|
|
|
| // The offline page found with specific offline ID does not match the passed
|
| @@ -722,17 +761,19 @@ TEST_F(OfflinePageRequestJobTest,
|
| InterceptRequest(
|
| kTestUrl2,
|
| "GET",
|
| kOfflinePageHeader,
|
| std::string(kOfflinePageHeaderReasonKey) + "=download " +
|
| kOfflinePageHeaderIDKey + "=" + base::Int64ToString(offline_id()),
|
| content::RESOURCE_TYPE_MAIN_FRAME);
|
| base::RunLoop().Run();
|
|
|
| EXPECT_EQ(0, bytes_read());
|
| - EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
|
| + VerifyInfo(false, 0);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| ExpectAggregatedRequestResultHistogram(
|
| OfflinePageRequestJob::AggregatedRequestResult::
|
| PAGE_NOT_FOUND_ON_CONNECTED_NETWORK);
|
| }
|
|
|
| } // namespace offline_pages
|
|
|