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

Side by Side Diff: chrome/browser/android/offline_pages/prerendering_offliner_unittest.cc

Issue 2637563002: [Offline Pages] Snapshotting on timeout of last retry. (Closed)
Patch Set: rebasing and a cl format Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/offline_pages/prerendering_offliner.h" 5 #include "chrome/browser/android/offline_pages/prerendering_offliner.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
11 #include "base/sys_info.h" 11 #include "base/sys_info.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "chrome/browser/android/offline_pages/prerendering_loader.h" 13 #include "chrome/browser/android/offline_pages/prerendering_loader.h"
14 #include "chrome/browser/net/prediction_options.h" 14 #include "chrome/browser/net/prediction_options.h"
15 #include "chrome/common/pref_names.h" 15 #include "chrome/common/pref_names.h"
16 #include "chrome/test/base/testing_profile.h" 16 #include "chrome/test/base/testing_profile.h"
17 #include "components/content_settings/core/common/pref_names.h" 17 #include "components/content_settings/core/common/pref_names.h"
18 #include "components/offline_pages/core/background/offliner.h" 18 #include "components/offline_pages/core/background/offliner.h"
19 #include "components/offline_pages/core/background/offliner_policy.h"
19 #include "components/offline_pages/core/background/save_page_request.h" 20 #include "components/offline_pages/core/background/save_page_request.h"
20 #include "components/offline_pages/core/stub_offline_page_model.h" 21 #include "components/offline_pages/core/stub_offline_page_model.h"
21 #include "components/prefs/pref_service.h" 22 #include "components/prefs/pref_service.h"
22 #include "content/public/test/test_browser_thread_bundle.h" 23 #include "content/public/test/test_browser_thread_bundle.h"
23 #include "content/public/test/web_contents_tester.h" 24 #include "content/public/test/web_contents_tester.h"
24 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
25 26
26 namespace offline_pages { 27 namespace offline_pages {
27 28
28 namespace { 29 namespace {
29 const int64_t kRequestId = 7; 30 const int64_t kRequestId = 7;
30 const GURL kHttpUrl("http://tunafish.com"); 31 const GURL kHttpUrl("http://tunafish.com");
31 const GURL kFileUrl("file://sailfish.png"); 32 const GURL kFileUrl("file://sailfish.png");
32 const ClientId kClientId("AsyncLoading", "88"); 33 const ClientId kClientId("AsyncLoading", "88");
33 const bool kUserRequested = true; 34 const bool kUserRequested = true;
34 35
35 // Mock Loader for testing the Offliner calls. 36 // Mock Loader for testing the Offliner calls.
36 class MockPrerenderingLoader : public PrerenderingLoader { 37 class MockPrerenderingLoader : public PrerenderingLoader {
37 public: 38 public:
38 explicit MockPrerenderingLoader(content::BrowserContext* browser_context) 39 explicit MockPrerenderingLoader(content::BrowserContext* browser_context)
39 : PrerenderingLoader(browser_context), 40 : PrerenderingLoader(browser_context),
40 can_prerender_(true), 41 can_prerender_(true),
41 mock_loading_(false), 42 mock_loading_(false),
42 mock_loaded_(false) {} 43 mock_loaded_(false),
44 mock_is_lowbar_met_(false),
45 start_snapshot_called_(false) {}
43 ~MockPrerenderingLoader() override {} 46 ~MockPrerenderingLoader() override {}
44 47
45 bool LoadPage(const GURL& url, const LoadPageCallback& callback) override { 48 bool LoadPage(const GURL& url, const LoadPageCallback& callback) override {
46 mock_loading_ = can_prerender_; 49 mock_loading_ = can_prerender_;
47 load_page_callback_ = callback; 50 load_page_callback_ = callback;
48 return mock_loading_; 51 return mock_loading_;
49 } 52 }
50 53
51 void StopLoading() override { 54 void StopLoading() override {
52 mock_loading_ = false; 55 mock_loading_ = false;
53 mock_loaded_ = false; 56 mock_loaded_ = false;
54 } 57 }
55 58
56 bool IsIdle() override { return !mock_loading_ && !mock_loaded_; } 59 bool IsIdle() override { return !mock_loading_ && !mock_loaded_; }
57 bool IsLoaded() override { return mock_loaded_; } 60 bool IsLoaded() override { return mock_loaded_; }
61 bool IsLowbarMet() override { return mock_is_lowbar_met_; }
62
63 void StartSnapshot() override { start_snapshot_called_ = true; }
58 64
59 void CompleteLoadingAsFailed() { 65 void CompleteLoadingAsFailed() {
60 DCHECK(mock_loading_); 66 DCHECK(mock_loading_);
61 mock_loading_ = false; 67 mock_loading_ = false;
62 mock_loaded_ = false; 68 mock_loaded_ = false;
63 base::ThreadTaskRunnerHandle::Get()->PostTask( 69 base::ThreadTaskRunnerHandle::Get()->PostTask(
64 FROM_HERE, 70 FROM_HERE,
65 base::Bind(load_page_callback_, Offliner::RequestStatus::LOADING_FAILED, 71 base::Bind(load_page_callback_, Offliner::RequestStatus::LOADING_FAILED,
66 nullptr /* web_contents */)); 72 nullptr /* web_contents */));
67 } 73 }
(...skipping 14 matching lines...) Expand all
82 mock_loading_ = false; 88 mock_loading_ = false;
83 mock_loaded_ = false; 89 mock_loaded_ = false;
84 base::ThreadTaskRunnerHandle::Get()->PostTask( 90 base::ThreadTaskRunnerHandle::Get()->PostTask(
85 FROM_HERE, base::Bind(load_page_callback_, 91 FROM_HERE, base::Bind(load_page_callback_,
86 Offliner::RequestStatus::LOADING_CANCELED, 92 Offliner::RequestStatus::LOADING_CANCELED,
87 nullptr /* web_contents */)); 93 nullptr /* web_contents */));
88 } 94 }
89 95
90 void DisablePrerendering() { can_prerender_ = false; } 96 void DisablePrerendering() { can_prerender_ = false; }
91 const LoadPageCallback& load_page_callback() { return load_page_callback_; } 97 const LoadPageCallback& load_page_callback() { return load_page_callback_; }
98 void set_is_lowbar_met(bool is_lowbar_met) {
99 mock_is_lowbar_met_ = is_lowbar_met;
100 }
101 bool start_snapshot_called() { return start_snapshot_called_; }
92 102
93 private: 103 private:
94 bool can_prerender_; 104 bool can_prerender_;
95 bool mock_loading_; 105 bool mock_loading_;
96 bool mock_loaded_; 106 bool mock_loaded_;
107 bool mock_is_lowbar_met_;
108 bool start_snapshot_called_;
97 LoadPageCallback load_page_callback_; 109 LoadPageCallback load_page_callback_;
98 110
99 DISALLOW_COPY_AND_ASSIGN(MockPrerenderingLoader); 111 DISALLOW_COPY_AND_ASSIGN(MockPrerenderingLoader);
100 }; 112 };
101 113
102 // Mock OfflinePageModel for testing the SavePage calls. 114 // Mock OfflinePageModel for testing the SavePage calls.
103 class MockOfflinePageModel : public StubOfflinePageModel { 115 class MockOfflinePageModel : public StubOfflinePageModel {
104 public: 116 public:
105 MockOfflinePageModel() : mock_saving_(false) {} 117 MockOfflinePageModel() : mock_saving_(false) {}
106 ~MockOfflinePageModel() override {} 118 ~MockOfflinePageModel() override {}
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 Offliner::CompletionCallback const callback() { 167 Offliner::CompletionCallback const callback() {
156 return base::Bind(&PrerenderingOfflinerTest::OnCompletion, 168 return base::Bind(&PrerenderingOfflinerTest::OnCompletion,
157 base::Unretained(this)); 169 base::Unretained(this));
158 } 170 }
159 171
160 bool SaveInProgress() const { return model_->mock_saving(); } 172 bool SaveInProgress() const { return model_->mock_saving(); }
161 MockPrerenderingLoader* loader() { return loader_; } 173 MockPrerenderingLoader* loader() { return loader_; }
162 MockOfflinePageModel* model() { return model_; } 174 MockOfflinePageModel* model() { return model_; }
163 bool completion_callback_called() { return completion_callback_called_; } 175 bool completion_callback_called() { return completion_callback_called_; }
164 Offliner::RequestStatus request_status() { return request_status_; } 176 Offliner::RequestStatus request_status() { return request_status_; }
177 OfflinerPolicy* policy() { return policy_; }
165 178
166 private: 179 private:
167 void OnCompletion(const SavePageRequest& request, 180 void OnCompletion(const SavePageRequest& request,
168 Offliner::RequestStatus status); 181 Offliner::RequestStatus status);
169 182
170 content::TestBrowserThreadBundle thread_bundle_; 183 content::TestBrowserThreadBundle thread_bundle_;
171 TestingProfile profile_; 184 TestingProfile profile_;
172 std::unique_ptr<PrerenderingOffliner> offliner_; 185 std::unique_ptr<PrerenderingOffliner> offliner_;
173 // Not owned. 186 // Not owned.
174 MockPrerenderingLoader* loader_; 187 MockPrerenderingLoader* loader_;
175 MockOfflinePageModel* model_; 188 MockOfflinePageModel* model_;
176 bool completion_callback_called_; 189 bool completion_callback_called_;
177 Offliner::RequestStatus request_status_; 190 Offliner::RequestStatus request_status_;
191 OfflinerPolicy* policy_;
178 192
179 DISALLOW_COPY_AND_ASSIGN(PrerenderingOfflinerTest); 193 DISALLOW_COPY_AND_ASSIGN(PrerenderingOfflinerTest);
180 }; 194 };
181 195
182 PrerenderingOfflinerTest::PrerenderingOfflinerTest() 196 PrerenderingOfflinerTest::PrerenderingOfflinerTest()
183 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), 197 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
184 completion_callback_called_(false), 198 completion_callback_called_(false),
185 request_status_(Offliner::RequestStatus::UNKNOWN) {} 199 request_status_(Offliner::RequestStatus::UNKNOWN) {}
186 200
187 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {} 201 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {}
188 202
189 void PrerenderingOfflinerTest::SetUp() { 203 void PrerenderingOfflinerTest::SetUp() {
190 model_ = new MockOfflinePageModel(); 204 model_ = new MockOfflinePageModel();
191 offliner_.reset(new PrerenderingOffliner(profile(), nullptr, model_)); 205 policy_ = new OfflinerPolicy();
206 offliner_.reset(new PrerenderingOffliner(profile(), policy_, model_));
192 std::unique_ptr<MockPrerenderingLoader> mock_loader( 207 std::unique_ptr<MockPrerenderingLoader> mock_loader(
193 new MockPrerenderingLoader(nullptr)); 208 new MockPrerenderingLoader(nullptr));
194 loader_ = mock_loader.get(); 209 loader_ = mock_loader.get();
195 offliner_->SetLoaderForTesting(std::move(mock_loader)); 210 offliner_->SetLoaderForTesting(std::move(mock_loader));
196 } 211 }
197 212
198 void PrerenderingOfflinerTest::OnCompletion(const SavePageRequest& request, 213 void PrerenderingOfflinerTest::OnCompletion(const SavePageRequest& request,
199 Offliner::RequestStatus status) { 214 Offliner::RequestStatus status) {
200 DCHECK(!completion_callback_called_); // Expect single callback per request. 215 DCHECK(!completion_callback_called_); // Expect single callback per request.
201 completion_callback_called_ = true; 216 completion_callback_called_ = true;
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 EXPECT_TRUE(offliner()->LoadAndSave(request, callback())); 407 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
393 EXPECT_FALSE(loader()->IsIdle()); 408 EXPECT_FALSE(loader()->IsIdle());
394 409
395 offliner()->SetApplicationStateForTesting( 410 offliner()->SetApplicationStateForTesting(
396 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES); 411 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
397 412
398 // Loader still loading since not low-end device. 413 // Loader still loading since not low-end device.
399 EXPECT_FALSE(loader()->IsIdle()); 414 EXPECT_FALSE(loader()->IsIdle());
400 } 415 }
401 416
417 TEST_F(PrerenderingOfflinerTest, HandleTimeoutWithLowbarAndCompletedTriesMet) {
418 offliner()->SetLowEndDeviceForTesting(false);
419
420 base::Time creation_time = base::Time::Now();
421 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
422 kUserRequested);
423 request.set_completed_attempt_count(policy()->GetMaxCompletedTries() - 1);
424 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
425 loader()->set_is_lowbar_met(true);
426 EXPECT_TRUE(offliner()->HandleTimeout(request));
427 EXPECT_TRUE(loader()->start_snapshot_called());
428 }
429
430 TEST_F(PrerenderingOfflinerTest,
431 HandleTimeoutWithLowbarAndCompletedTriesMetLowEndDevice) {
432 offliner()->SetLowEndDeviceForTesting(true);
433
434 base::Time creation_time = base::Time::Now();
435 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
436 kUserRequested);
437 request.set_completed_attempt_count(policy()->GetMaxCompletedTries() - 1);
438 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
439 loader()->set_is_lowbar_met(true);
440 EXPECT_TRUE(offliner()->HandleTimeout(request));
441 EXPECT_TRUE(loader()->start_snapshot_called());
442 }
443
444 TEST_F(PrerenderingOfflinerTest,
445 HandleTimeoutCompletedTriesMetWithoutLowbarMet) {
446 offliner()->SetLowEndDeviceForTesting(false);
447
448 base::Time creation_time = base::Time::Now();
449 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
450 kUserRequested);
451 request.set_completed_attempt_count(policy()->GetMaxCompletedTries() - 1);
452 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
453 loader()->set_is_lowbar_met(false);
454 EXPECT_FALSE(offliner()->HandleTimeout(request));
455 EXPECT_FALSE(loader()->start_snapshot_called());
456 }
457
458 TEST_F(PrerenderingOfflinerTest, HandleTimeoutWithLowbarAndStartedTriesMet) {
459 offliner()->SetLowEndDeviceForTesting(false);
460
461 base::Time creation_time = base::Time::Now();
462 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
463 kUserRequested);
464 request.set_started_attempt_count(policy()->GetMaxStartedTries() - 1);
465 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
466 loader()->set_is_lowbar_met(true);
467 EXPECT_TRUE(offliner()->HandleTimeout(request));
468 EXPECT_TRUE(loader()->start_snapshot_called());
469 }
470
471 TEST_F(PrerenderingOfflinerTest, HandleTimeoutWithOnlyLowbarMet) {
472 offliner()->SetLowEndDeviceForTesting(false);
473
474 base::Time creation_time = base::Time::Now();
475 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
476 kUserRequested);
477 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
478 loader()->set_is_lowbar_met(true);
479 EXPECT_FALSE(offliner()->HandleTimeout(request));
480 EXPECT_FALSE(loader()->start_snapshot_called());
481 }
482
402 } // namespace offline_pages 483 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698