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

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

Issue 2007783002: Adds PrerenderingOffliner implementation for handling Loader callbacks and then performing SavePage… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ploader
Patch Set: Update for petewil comment Created 4 years, 7 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"
11 #include "base/threading/thread_task_runner_handle.h"
10 #include "chrome/browser/android/offline_pages/prerendering_loader.h" 12 #include "chrome/browser/android/offline_pages/prerendering_loader.h"
11 #include "components/offline_pages/background/offliner.h" 13 #include "components/offline_pages/background/offliner.h"
12 #include "components/offline_pages/background/save_page_request.h" 14 #include "components/offline_pages/background/save_page_request.h"
13 #include "content/public/test/test_browser_thread_bundle.h" 15 #include "content/public/test/test_browser_thread_bundle.h"
14 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
15 17
16 namespace offline_pages { 18 namespace offline_pages {
17 19
18 namespace { 20 namespace {
19 const int64_t kRequestId = 7; 21 const int64_t kRequestId = 7;
20 const GURL kHttpUrl("http://tunafish.com"); 22 const GURL kHttpUrl("http://tunafish.com");
21 const GURL kFileUrl("file://sailfish.png");
22 const ClientId kClientId("AsyncLoading", "88"); 23 const ClientId kClientId("AsyncLoading", "88");
23 24
24 // Mock Loader for testing the Offliner calls. 25 // Mock Loader for testing the Offliner calls.
25 class MockPrerenderingLoader : public PrerenderingLoader { 26 class MockPrerenderingLoader : public PrerenderingLoader {
26 public: 27 public:
27 explicit MockPrerenderingLoader(content::BrowserContext* browser_context) 28 explicit MockPrerenderingLoader(content::BrowserContext* browser_context)
28 : PrerenderingLoader(browser_context), 29 : PrerenderingLoader(browser_context),
29 mock_loading_(false), 30 mock_loading_(false),
30 mock_loaded_(false) {} 31 mock_loaded_(false) {}
31 ~MockPrerenderingLoader() override {} 32 ~MockPrerenderingLoader() override {}
32 33
33 bool LoadPage(const GURL& url, const LoadPageCallback& callback) override { 34 bool LoadPage(const GURL& url, const LoadPageCallback& callback) override {
34 mock_loading_ = true; 35 mock_loading_ = true;
36 load_page_callback_ = callback;
35 return mock_loading_; 37 return mock_loading_;
36 } 38 }
37 39
38 void StopLoading() override { 40 void StopLoading() override {
39 mock_loading_ = false; 41 mock_loading_ = false;
40 mock_loaded_ = false; 42 mock_loaded_ = false;
41 } 43 }
42 bool IsIdle() override { return !mock_loading_ && !mock_loaded_; } 44 bool IsIdle() override { return !mock_loading_ && !mock_loaded_; }
43 bool IsLoaded() override { return mock_loaded_; } 45 bool IsLoaded() override { return mock_loaded_; }
44 46
47 void CallbackForLoadFailed() {
48 DCHECK(mock_loading_);
49 mock_loading_ = false;
50 mock_loaded_ = false;
51 base::ThreadTaskRunnerHandle::Get()->PostTask(
52 FROM_HERE,
53 base::Bind(load_page_callback_, Offliner::RequestStatus::FAILED,
54 nullptr /* web_contents */));
55 }
56
45 bool mock_loading() const { return mock_loading_; } 57 bool mock_loading() const { return mock_loading_; }
58 bool mock_loaded() const { return mock_loaded_; }
59 const LoadPageCallback& load_page_callback() { return load_page_callback_; }
46 60
47 private: 61 private:
48 bool mock_loading_; 62 bool mock_loading_;
49 bool mock_loaded_; 63 bool mock_loaded_;
64 LoadPageCallback load_page_callback_;
50 65
51 DISALLOW_COPY_AND_ASSIGN(MockPrerenderingLoader); 66 DISALLOW_COPY_AND_ASSIGN(MockPrerenderingLoader);
52 }; 67 };
53 68
69 void PumpLoop() {
70 base::RunLoop().RunUntilIdle();
71 }
72
54 } // namespace 73 } // namespace
55 74
56 class PrerenderingOfflinerTest : public testing::Test { 75 class PrerenderingOfflinerTest : public testing::Test {
57 public: 76 public:
58 PrerenderingOfflinerTest(); 77 PrerenderingOfflinerTest();
59 ~PrerenderingOfflinerTest() override; 78 ~PrerenderingOfflinerTest() override;
60 79
61 void SetUp() override; 80 void SetUp() override;
62 81
63 PrerenderingOffliner* offliner() const { return offliner_.get(); } 82 PrerenderingOffliner* offliner() const { return offliner_.get(); }
64 Offliner::CompletionCallback const callback() { 83 Offliner::CompletionCallback const callback() {
65 return base::Bind(&PrerenderingOfflinerTest::OnCompletion, 84 return base::Bind(&PrerenderingOfflinerTest::OnCompletion,
66 base::Unretained(this)); 85 base::Unretained(this));
67 } 86 }
68 87
69 bool loading() const { return loader_->mock_loading(); } 88 bool loading() const { return loader_->mock_loading(); }
70 Offliner::RequestStatus completion_status() { return completion_status_; } 89 bool loaded() const { return loader_->mock_loaded(); }
90 MockPrerenderingLoader* loader() { return loader_; }
91 bool callback_called() { return callback_called_; }
92 Offliner::RequestStatus request_status() { return request_status_; }
71 93
72 private: 94 private:
73 void OnCompletion(const SavePageRequest& request, 95 void OnCompletion(const SavePageRequest& request,
74 Offliner::RequestStatus status); 96 Offliner::RequestStatus status);
75 97
76 content::TestBrowserThreadBundle thread_bundle_; 98 content::TestBrowserThreadBundle thread_bundle_;
77 std::unique_ptr<PrerenderingOffliner> offliner_; 99 std::unique_ptr<PrerenderingOffliner> offliner_;
78 // Not owned. 100 // Not owned.
79 MockPrerenderingLoader* loader_; 101 MockPrerenderingLoader* loader_;
80 Offliner::RequestStatus completion_status_; 102 bool callback_called_;
103 Offliner::RequestStatus request_status_;
81 104
82 DISALLOW_COPY_AND_ASSIGN(PrerenderingOfflinerTest); 105 DISALLOW_COPY_AND_ASSIGN(PrerenderingOfflinerTest);
83 }; 106 };
84 107
85 PrerenderingOfflinerTest::PrerenderingOfflinerTest() 108 PrerenderingOfflinerTest::PrerenderingOfflinerTest()
86 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} 109 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
110 callback_called_(false),
111 request_status_(Offliner::RequestStatus::UNKNOWN) {}
87 112
88 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {} 113 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {}
89 114
90 void PrerenderingOfflinerTest::SetUp() { 115 void PrerenderingOfflinerTest::SetUp() {
91 offliner_.reset(new PrerenderingOffliner(nullptr, nullptr, nullptr)); 116 offliner_.reset(new PrerenderingOffliner(nullptr, nullptr, nullptr));
92 std::unique_ptr<MockPrerenderingLoader> mock_loader( 117 std::unique_ptr<MockPrerenderingLoader> mock_loader(
93 new MockPrerenderingLoader(nullptr)); 118 new MockPrerenderingLoader(nullptr));
94 loader_ = mock_loader.get(); 119 loader_ = mock_loader.get();
95 offliner_->SetLoaderForTesting(std::move(mock_loader)); 120 offliner_->SetLoaderForTesting(std::move(mock_loader));
96 } 121 }
97 122
98 void PrerenderingOfflinerTest::OnCompletion(const SavePageRequest& request, 123 void PrerenderingOfflinerTest::OnCompletion(const SavePageRequest& request,
99 Offliner::RequestStatus status) { 124 Offliner::RequestStatus status) {
100 completion_status_ = status; 125 DCHECK(!callback_called_); // Only expect single callback per request.
126 callback_called_ = true;
127 request_status_ = status;
101 } 128 }
102 129
103 // Tests initiate loading. 130 TEST_F(PrerenderingOfflinerTest, LoadAndSaveLoadStartedButFails) {
104 TEST_F(PrerenderingOfflinerTest, LoadAndSaveBadUrl) {
105 base::Time creation_time = base::Time::Now();
106 SavePageRequest request(kRequestId, kFileUrl, kClientId, creation_time);
107 EXPECT_FALSE(offliner()->LoadAndSave(request, callback()));
108 EXPECT_FALSE(loading());
109 }
110
111 // Tests initiate loading.
112 TEST_F(PrerenderingOfflinerTest, LoadAndSaveStartsLoading) {
113 base::Time creation_time = base::Time::Now(); 131 base::Time creation_time = base::Time::Now();
114 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time); 132 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
115 EXPECT_TRUE(offliner()->LoadAndSave(request, callback())); 133 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
116 EXPECT_TRUE(loading()); 134 EXPECT_TRUE(loading());
135 EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
136
137 loader()->CallbackForLoadFailed();
138 PumpLoop();
139 EXPECT_TRUE(callback_called());
140 EXPECT_EQ(Offliner::RequestStatus::FAILED, request_status());
141 EXPECT_FALSE(loading());
142 EXPECT_FALSE(loaded());
117 } 143 }
118 144
119 // Tests cancels loading. 145 TEST_F(PrerenderingOfflinerTest, CancelWhenLoading) {
120 TEST_F(PrerenderingOfflinerTest, CancelLoading) {
121 base::Time creation_time = base::Time::Now(); 146 base::Time creation_time = base::Time::Now();
122 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time); 147 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
123 EXPECT_TRUE(offliner()->LoadAndSave(request, callback())); 148 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
124 EXPECT_TRUE(loading()); 149 EXPECT_TRUE(loading());
125 150
126 offliner()->Cancel(); 151 offliner()->Cancel();
127 EXPECT_FALSE(loading()); 152 EXPECT_FALSE(loading());
128 } 153 }
129 154
130 } // namespace offline_pages 155 } // namespace offline_pages
OLDNEW
« no previous file with comments | « chrome/browser/android/offline_pages/prerendering_offliner.cc ('k') | components/offline_pages/background/offliner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698