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

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: 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"
13 #include "chrome/test/base/testing_profile.h"
11 #include "components/offline_pages/background/offliner.h" 14 #include "components/offline_pages/background/offliner.h"
12 #include "components/offline_pages/background/save_page_request.h" 15 #include "components/offline_pages/background/save_page_request.h"
13 #include "content/public/test/test_browser_thread_bundle.h" 16 #include "content/public/test/test_browser_thread_bundle.h"
17 #include "content/public/test/web_contents_tester.h"
14 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
15 19
16 namespace offline_pages { 20 namespace offline_pages {
17 21
18 namespace { 22 namespace {
19 const int64_t kRequestId = 7; 23 const int64_t kRequestId = 7;
20 const GURL kHttpUrl("http://tunafish.com"); 24 const GURL kHttpUrl("http://tunafish.com");
21 const GURL kFileUrl("file://sailfish.png");
22 const ClientId kClientId("AsyncLoading", "88"); 25 const ClientId kClientId("AsyncLoading", "88");
23 26
24 // Mock Loader for testing the Offliner calls. 27 // Mock Loader for testing the Offliner calls.
25 class MockPrerenderingLoader : public PrerenderingLoader { 28 class MockPrerenderingLoader : public PrerenderingLoader {
26 public: 29 public:
27 explicit MockPrerenderingLoader(content::BrowserContext* browser_context) 30 explicit MockPrerenderingLoader(content::BrowserContext* browser_context)
28 : PrerenderingLoader(browser_context), 31 : PrerenderingLoader(browser_context),
29 mock_loading_(false), 32 mock_loading_(false),
30 mock_loaded_(false) {} 33 mock_loaded_(false) {}
31 ~MockPrerenderingLoader() override {} 34 ~MockPrerenderingLoader() override {}
32 35
33 bool LoadPage(const GURL& url, const LoadPageCallback& callback) override { 36 bool LoadPage(const GURL& url, const LoadPageCallback& callback) override {
34 mock_loading_ = true; 37 mock_loading_ = true;
38 load_page_callback_ = callback;
35 return mock_loading_; 39 return mock_loading_;
36 } 40 }
37 41
38 void StopLoading() override { 42 void StopLoading() override {
39 mock_loading_ = false; 43 mock_loading_ = false;
40 mock_loaded_ = false; 44 mock_loaded_ = false;
41 } 45 }
42 bool IsIdle() override { return !mock_loading_ && !mock_loaded_; } 46 bool IsIdle() override { return !mock_loading_ && !mock_loaded_; }
43 bool IsLoaded() override { return mock_loaded_; } 47 bool IsLoaded() override { return mock_loaded_; }
44 48
49 void CallbackForLoadFailed() {
50 DCHECK(mock_loading_);
51 mock_loading_ = false;
52 mock_loaded_ = false;
53 base::ThreadTaskRunnerHandle::Get()->PostTask(
54 FROM_HERE,
55 base::Bind(load_page_callback_, Offliner::RequestStatus::FAILED,
56 nullptr /* web_contents */));
57 }
58
59 void CallbackForLoaded() {
60 DCHECK(mock_loading_);
61 mock_loading_ = false;
62 mock_loaded_ = true;
63 base::ThreadTaskRunnerHandle::Get()->PostTask(
64 FROM_HERE,
65 base::Bind(load_page_callback_, Offliner::RequestStatus::LOADED,
66 content::WebContentsTester::CreateTestWebContents(
67 new TestingProfile(), NULL)));
68 }
69
70 void CallbackForLoadCanceledAfterLoaded() {
71 DCHECK(mock_loaded_);
72 mock_loading_ = false;
73 mock_loaded_ = false;
74 base::ThreadTaskRunnerHandle::Get()->PostTask(
75 FROM_HERE,
76 base::Bind(load_page_callback_, Offliner::RequestStatus::CANCELED,
77 nullptr /* web_contents */));
78 }
79
45 bool mock_loading() const { return mock_loading_; } 80 bool mock_loading() const { return mock_loading_; }
81 bool mock_loaded() const { return mock_loaded_; }
82 const LoadPageCallback& load_page_callback() { return load_page_callback_; }
46 83
47 private: 84 private:
48 bool mock_loading_; 85 bool mock_loading_;
49 bool mock_loaded_; 86 bool mock_loaded_;
87 LoadPageCallback load_page_callback_;
50 88
51 DISALLOW_COPY_AND_ASSIGN(MockPrerenderingLoader); 89 DISALLOW_COPY_AND_ASSIGN(MockPrerenderingLoader);
52 }; 90 };
53 91
92 class TestPrerenderingOffliner : public PrerenderingOffliner {
Pete Williamson 2016/05/24 00:40:07 This is not the testing strategy I normally see.
dougarnett 2016/05/24 19:07:27 I'm not really happy with it either (I have TODO's
Pete Williamson 2016/05/24 21:18:42 We discussed breaking out the unit tests to a new
dougarnett 2016/05/25 18:04:19 Acknowledged.
93 public:
94 TestPrerenderingOffliner()
95 : PrerenderingOffliner(nullptr, nullptr, nullptr),
96 can_save_(true),
97 mock_saving_(false) {}
98
99 ~TestPrerenderingOffliner() override {}
100
101 void SetCanSaveFalse() { can_save_ = false; }
102
103 void CallbackForSaveFailed() {
104 DCHECK(mock_saving_);
105 mock_saving_ = false;
106 base::ThreadTaskRunnerHandle::Get()->PostTask(
107 FROM_HERE, base::Bind(save_page_callback_,
108 SavePageResult::ARCHIVE_CREATION_FAILED, 0));
109 }
110
111 void CallbackForSaved() {
112 DCHECK(mock_saving_);
113 mock_saving_ = false;
114 base::ThreadTaskRunnerHandle::Get()->PostTask(
115 FROM_HERE,
116 base::Bind(save_page_callback_, SavePageResult::SUCCESS, 123456));
117 }
118
119 bool mock_saving() { return mock_saving_; }
120
121 protected:
122 bool CanSavePage(const GURL& url) override { return can_save_; }
123 void SavePage(const GURL& url,
124 const ClientId& client_id,
125 std::unique_ptr<OfflinePageArchiver> archiver,
126 const SavePageCallback& callback) override {
127 mock_saving_ = true;
128 save_page_callback_ = callback;
129 }
130
131 private:
132 bool can_save_;
133 bool mock_saving_;
134 SavePageCallback save_page_callback_;
135 };
136
137 void PumpLoop() {
138 base::RunLoop().RunUntilIdle();
139 }
140
54 } // namespace 141 } // namespace
55 142
56 class PrerenderingOfflinerTest : public testing::Test { 143 class PrerenderingOfflinerTest : public testing::Test {
57 public: 144 public:
58 PrerenderingOfflinerTest(); 145 PrerenderingOfflinerTest();
59 ~PrerenderingOfflinerTest() override; 146 ~PrerenderingOfflinerTest() override;
60 147
61 void SetUp() override; 148 void SetUp() override;
62 149
63 PrerenderingOffliner* offliner() const { return offliner_.get(); } 150 TestPrerenderingOffliner* offliner() const { return offliner_.get(); }
64 Offliner::CompletionCallback const callback() { 151 Offliner::CompletionCallback const callback() {
65 return base::Bind(&PrerenderingOfflinerTest::OnCompletion, 152 return base::Bind(&PrerenderingOfflinerTest::OnCompletion,
66 base::Unretained(this)); 153 base::Unretained(this));
67 } 154 }
68 155
69 bool loading() const { return loader_->mock_loading(); } 156 bool loading() const { return loader_->mock_loading(); }
70 Offliner::RequestStatus completion_status() { return completion_status_; } 157 bool loaded() const { return loader_->mock_loaded(); }
158 bool saving() const { return offliner_->mock_saving(); }
159 MockPrerenderingLoader* loader() { return loader_; }
160 bool callback_called() { return callback_called_; }
161 Offliner::RequestStatus request_status() { return request_status_; }
71 162
72 private: 163 private:
73 void OnCompletion(const SavePageRequest& request, 164 void OnCompletion(const SavePageRequest& request,
74 Offliner::RequestStatus status); 165 Offliner::RequestStatus status);
75 166
76 content::TestBrowserThreadBundle thread_bundle_; 167 content::TestBrowserThreadBundle thread_bundle_;
77 std::unique_ptr<PrerenderingOffliner> offliner_; 168 std::unique_ptr<TestPrerenderingOffliner> offliner_;
78 // Not owned. 169 // Not owned.
79 MockPrerenderingLoader* loader_; 170 MockPrerenderingLoader* loader_;
80 Offliner::RequestStatus completion_status_; 171 bool callback_called_;
172 Offliner::RequestStatus request_status_;
81 173
82 DISALLOW_COPY_AND_ASSIGN(PrerenderingOfflinerTest); 174 DISALLOW_COPY_AND_ASSIGN(PrerenderingOfflinerTest);
83 }; 175 };
84 176
85 PrerenderingOfflinerTest::PrerenderingOfflinerTest() 177 PrerenderingOfflinerTest::PrerenderingOfflinerTest()
86 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} 178 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
179 callback_called_(false),
180 request_status_(Offliner::RequestStatus::UNKNOWN) {}
87 181
88 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {} 182 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {}
89 183
90 void PrerenderingOfflinerTest::SetUp() { 184 void PrerenderingOfflinerTest::SetUp() {
91 offliner_.reset(new PrerenderingOffliner(nullptr, nullptr, nullptr)); 185 offliner_.reset(new TestPrerenderingOffliner());
92 std::unique_ptr<MockPrerenderingLoader> mock_loader( 186 std::unique_ptr<MockPrerenderingLoader> mock_loader(
93 new MockPrerenderingLoader(nullptr)); 187 new MockPrerenderingLoader(nullptr));
94 loader_ = mock_loader.get(); 188 loader_ = mock_loader.get();
95 offliner_->SetLoaderForTesting(std::move(mock_loader)); 189 offliner_->SetLoaderForTesting(std::move(mock_loader));
96 } 190 }
97 191
98 void PrerenderingOfflinerTest::OnCompletion(const SavePageRequest& request, 192 void PrerenderingOfflinerTest::OnCompletion(const SavePageRequest& request,
99 Offliner::RequestStatus status) { 193 Offliner::RequestStatus status) {
100 completion_status_ = status; 194 DCHECK(!callback_called_); // Only expect single callback per request.
195 callback_called_ = true;
196 request_status_ = status;
101 } 197 }
102 198
103 // Tests initiate loading. 199 TEST_F(PrerenderingOfflinerTest, LoadAndSaveCanSaveFalse) {
104 TEST_F(PrerenderingOfflinerTest, LoadAndSaveBadUrl) {
105 base::Time creation_time = base::Time::Now(); 200 base::Time creation_time = base::Time::Now();
106 SavePageRequest request(kRequestId, kFileUrl, kClientId, creation_time); 201 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
202 offliner()->SetCanSaveFalse();
107 EXPECT_FALSE(offliner()->LoadAndSave(request, callback())); 203 EXPECT_FALSE(offliner()->LoadAndSave(request, callback()));
108 EXPECT_FALSE(loading()); 204 EXPECT_FALSE(loading());
109 } 205 }
110 206
111 // Tests initiate loading. 207 TEST_F(PrerenderingOfflinerTest, LoadAndSaveLoadStartedButFails) {
112 TEST_F(PrerenderingOfflinerTest, LoadAndSaveStartsLoading) {
113 base::Time creation_time = base::Time::Now(); 208 base::Time creation_time = base::Time::Now();
114 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time); 209 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
115 EXPECT_TRUE(offliner()->LoadAndSave(request, callback())); 210 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
116 EXPECT_TRUE(loading()); 211 EXPECT_TRUE(loading());
212 EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
213
214 loader()->CallbackForLoadFailed();
215 PumpLoop();
216 EXPECT_TRUE(callback_called());
217 EXPECT_EQ(Offliner::RequestStatus::FAILED, request_status());
218 EXPECT_FALSE(loading());
219 EXPECT_FALSE(saving());
117 } 220 }
118 221
119 // Tests cancels loading.
120 TEST_F(PrerenderingOfflinerTest, CancelLoading) { 222 TEST_F(PrerenderingOfflinerTest, CancelLoading) {
121 base::Time creation_time = base::Time::Now(); 223 base::Time creation_time = base::Time::Now();
122 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time); 224 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
123 EXPECT_TRUE(offliner()->LoadAndSave(request, callback())); 225 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
124 EXPECT_TRUE(loading()); 226 EXPECT_TRUE(loading());
125 227
126 offliner()->Cancel(); 228 offliner()->Cancel();
127 EXPECT_FALSE(loading()); 229 EXPECT_FALSE(loading());
128 } 230 }
129 231
232 TEST_F(PrerenderingOfflinerTest, LoadAndSaveLoadedButSaveFails) {
233 base::Time creation_time = base::Time::Now();
234 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
235 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
236 EXPECT_TRUE(loading());
237 EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
238
239 loader()->CallbackForLoaded();
240 PumpLoop();
241 EXPECT_FALSE(callback_called());
242 EXPECT_TRUE(loaded());
243 EXPECT_TRUE(saving());
244
245 offliner()->CallbackForSaveFailed();
246 PumpLoop();
247 EXPECT_TRUE(callback_called());
248 EXPECT_EQ(Offliner::RequestStatus::FAILED_SAVE, request_status());
249 EXPECT_FALSE(saving());
250 }
251
252 TEST_F(PrerenderingOfflinerTest, LoadAndSaveLoadedAndSaved) {
253 base::Time creation_time = base::Time::Now();
254 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
255 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
256 EXPECT_TRUE(loading());
257 EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
258
259 loader()->CallbackForLoaded();
260 PumpLoop();
261 EXPECT_FALSE(callback_called());
262 EXPECT_TRUE(loaded());
263 EXPECT_TRUE(saving());
264
265 offliner()->CallbackForSaved();
266 PumpLoop();
267 EXPECT_TRUE(callback_called());
268 EXPECT_EQ(Offliner::RequestStatus::SAVED, request_status());
269 EXPECT_FALSE(saving());
270 }
271
272 TEST_F(PrerenderingOfflinerTest, LoadAndSaveLoadedButThenCanceledFromLoader) {
273 base::Time creation_time = base::Time::Now();
274 SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time);
275 EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
276 EXPECT_TRUE(loading());
277 EXPECT_EQ(Offliner::RequestStatus::UNKNOWN, request_status());
278
279 loader()->CallbackForLoaded();
280 PumpLoop();
281 EXPECT_FALSE(callback_called());
282 EXPECT_TRUE(loaded());
283 EXPECT_TRUE(saving());
284
285 loader()->CallbackForLoadCanceledAfterLoaded();
286 PumpLoop();
287 EXPECT_TRUE(callback_called());
288 EXPECT_EQ(Offliner::RequestStatus::CANCELED, request_status());
289 EXPECT_FALSE(loaded());
290 }
291
130 } // namespace offline_pages 292 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698