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

Side by Side Diff: components/precache/content/precache_manager_unittest.cc

Issue 1961153003: Add pause/resume functionality to precache (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: test fix 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
« no previous file with comments | « components/precache/content/precache_manager.cc ('k') | components/precache/core/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/precache/content/precache_manager.h" 5 #include "components/precache/content/precache_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <memory>
10 #include <set> 11 #include <set>
11 #include <string> 12 #include <string>
12 13
13 #include "base/bind.h" 14 #include "base/bind.h"
14 #include "base/callback.h" 15 #include "base/callback.h"
15 #include "base/command_line.h" 16 #include "base/command_line.h"
16 #include "base/compiler_specific.h" 17 #include "base/compiler_specific.h"
18 #include "base/files/file_path.h"
19 #include "base/files/scoped_temp_dir.h"
17 #include "base/location.h" 20 #include "base/location.h"
21 #include "base/run_loop.h"
18 #include "base/single_thread_task_runner.h" 22 #include "base/single_thread_task_runner.h"
19 #include "base/test/histogram_tester.h" 23 #include "base/test/histogram_tester.h"
20 #include "base/threading/thread_task_runner_handle.h" 24 #include "base/threading/thread_task_runner_handle.h"
21 #include "components/history/core/browser/history_constants.h" 25 #include "components/history/core/browser/history_constants.h"
22 #include "components/history/core/browser/history_service.h" 26 #include "components/history/core/browser/history_service.h"
23 #include "components/history/core/browser/history_types.h" 27 #include "components/history/core/browser/history_types.h"
28 #include "components/precache/core/precache_database.h"
24 #include "components/precache/core/precache_switches.h" 29 #include "components/precache/core/precache_switches.h"
30 #include "components/precache/core/proto/unfinished_work.pb.h"
25 #include "content/public/browser/browser_thread.h" 31 #include "content/public/browser/browser_thread.h"
26 #include "content/public/test/test_browser_context.h" 32 #include "content/public/test/test_browser_context.h"
27 #include "content/public/test/test_browser_thread_bundle.h" 33 #include "content/public/test/test_browser_thread_bundle.h"
28 #include "net/http/http_status_code.h" 34 #include "net/http/http_status_code.h"
29 #include "net/url_request/test_url_fetcher_factory.h" 35 #include "net/url_request/test_url_fetcher_factory.h"
30 #include "net/url_request/url_request_status.h" 36 #include "net/url_request/url_request_status.h"
31 #include "net/url_request/url_request_test_util.h" 37 #include "net/url_request/url_request_test_util.h"
32 #include "testing/gmock/include/gmock/gmock.h" 38 #include "testing/gmock/include/gmock/gmock.h"
33 #include "testing/gtest/include/gtest/gtest.h" 39 #include "testing/gtest/include/gtest/gtest.h"
34 #include "url/gurl.h" 40 #include "url/gurl.h"
35 41
36 namespace precache { 42 namespace precache {
37 43
38 namespace { 44 namespace {
39 45
40 using ::testing::_; 46 using ::testing::_;
41 using ::testing::ContainerEq; 47 using ::testing::ContainerEq;
42 using ::testing::ElementsAre; 48 using ::testing::ElementsAre;
43 using ::testing::Invoke; 49 using ::testing::Invoke;
44 using ::testing::IsEmpty; 50 using ::testing::IsEmpty;
45 using ::testing::Pair; 51 using ::testing::Pair;
46 using ::testing::SaveArg; 52 using ::testing::SaveArg;
47 53
48 const char kConfigURL[] = "http://config-url.com"; 54 const char kConfigURL[] = "http://config-url.com";
49 const char kManifestURLPrefix[] = "http://manifest-url-prefix.com/"; 55 const char kManifestURLPrefix[] = "http://manifest-url-prefix.com/";
50 const char kGoodManifestURL[] = 56 const char kGoodManifestURL[] =
51 "http://manifest-url-prefix.com/good-manifest.com"; 57 "http://manifest-url-prefix.com/good-manifest.com";
58 const char kEvilManifestURL[] =
59 "http://manifest-url-prefix.com/evil-manifest.com";
52 60
53 class TestURLFetcherCallback { 61 class TestURLFetcherCallback {
54 public: 62 public:
55 std::unique_ptr<net::FakeURLFetcher> CreateURLFetcher( 63 std::unique_ptr<net::FakeURLFetcher> CreateURLFetcher(
56 const GURL& url, 64 const GURL& url,
57 net::URLFetcherDelegate* delegate, 65 net::URLFetcherDelegate* delegate,
58 const std::string& response_data, 66 const std::string& response_data,
59 net::HttpStatusCode response_code, 67 net::HttpStatusCode response_code,
60 net::URLRequestStatus::Status status) { 68 net::URLRequestStatus::Status status) {
61 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher( 69 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher(
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 bool was_on_done_called() const { 118 bool was_on_done_called() const {
111 return was_on_done_called_; 119 return was_on_done_called_;
112 } 120 }
113 121
114 private: 122 private:
115 bool was_on_done_called_; 123 bool was_on_done_called_;
116 }; 124 };
117 125
118 class PrecacheManagerUnderTest : public PrecacheManager { 126 class PrecacheManagerUnderTest : public PrecacheManager {
119 public: 127 public:
120 PrecacheManagerUnderTest(content::BrowserContext* browser_context, 128 PrecacheManagerUnderTest(
121 const sync_driver::SyncService* const sync_service, 129 content::BrowserContext* browser_context,
122 const history::HistoryService* const history_service) 130 const sync_driver::SyncService* const sync_service,
123 : PrecacheManager(browser_context, sync_service, history_service), 131 const history::HistoryService* const history_service,
124 control_group_(false) {} 132 const base::FilePath& db_path,
133 std::unique_ptr<PrecacheDatabase> precache_database)
134 : PrecacheManager(
135 browser_context, sync_service, history_service,
136 db_path, std::move(precache_database)),
137 control_group_(false) {
138 }
125 bool IsInExperimentGroup() const override { return !control_group_; } 139 bool IsInExperimentGroup() const override { return !control_group_; }
126 bool IsInControlGroup() const override { return control_group_; } 140 bool IsInControlGroup() const override { return control_group_; }
127 bool IsPrecachingAllowed() const override { return true; } 141 bool IsPrecachingAllowed() const override { return true; }
128 void SetInControlGroup(bool in_control_group) { 142 void SetInControlGroup(bool in_control_group) {
129 control_group_ = in_control_group; 143 control_group_ = in_control_group;
130 } 144 }
131 145
132 private: 146 private:
133 bool control_group_; 147 bool control_group_;
134 }; 148 };
135 149
136 class PrecacheManagerTest : public testing::Test { 150 class PrecacheManagerTest : public testing::Test {
137 public: 151 public:
138 PrecacheManagerTest() 152 PrecacheManagerTest()
139 : precache_manager_(&browser_context_, 153 : factory_(nullptr,
140 nullptr /* sync_service */,
141 &history_service_),
142 factory_(nullptr,
143 base::Bind(&TestURLFetcherCallback::CreateURLFetcher, 154 base::Bind(&TestURLFetcherCallback::CreateURLFetcher,
144 base::Unretained(&url_callback_))) {} 155 base::Unretained(&url_callback_))) {}
145 156
146 ~PrecacheManagerTest() { 157 ~PrecacheManagerTest() {
147 // precache_manager_'s constructor releases a PrecacheDatabase and deletes 158 // precache_manager_'s constructor releases a PrecacheDatabase and deletes
148 // it on the DB thread. PrecacheDatabase already has a pending Init call 159 // it on the DB thread. PrecacheDatabase already has a pending Init call
149 // which will assert in debug builds because the directory passed to it is 160 // which will assert in debug builds because the directory passed to it is
150 // deleted. So manually ensure that the task is run before browser_context_ 161 // deleted. So manually ensure that the task is run before browser_context_
151 // is destructed. 162 // is destructed.
152 base::MessageLoop::current()->RunUntilIdle(); 163 base::MessageLoop::current()->RunUntilIdle();
153 } 164 }
154 165
155 protected: 166 protected:
156 void SetUp() override { 167 void SetUp() override {
157 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 168 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
158 switches::kPrecacheConfigSettingsURL, kConfigURL); 169 switches::kPrecacheConfigSettingsURL, kConfigURL);
159 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 170 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
160 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); 171 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix);
172 std::unique_ptr<PrecacheDatabase> precache_database(
173 new PrecacheDatabase());
174 precache_database_ = precache_database.get();
175
176 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
177 base::FilePath db_path = scoped_temp_dir_.path().Append(
178 base::FilePath(FILE_PATH_LITERAL("precache_database")));
161 179
162 // Make the fetch of the precache configuration settings fail. Precaching 180 // Make the fetch of the precache configuration settings fail. Precaching
163 // should still complete normally in this case. 181 // should still complete normally in this case.
164 factory_.SetFakeResponse(GURL(kConfigURL), "", 182 factory_.SetFakeResponse(GURL(kConfigURL), "",
165 net::HTTP_INTERNAL_SERVER_ERROR, 183 net::HTTP_INTERNAL_SERVER_ERROR,
166 net::URLRequestStatus::FAILED); 184 net::URLRequestStatus::FAILED);
185 precache_manager_.reset(
186 new PrecacheManagerUnderTest(
187 &browser_context_, nullptr /* sync_service */,
188 &history_service_, db_path, std::move(precache_database)));
189 base::MessageLoop::current()->RunUntilIdle();
167 } 190 }
168 191
169 // Must be declared first so that it is destroyed last. 192 // Must be declared first so that it is destroyed last.
170 content::TestBrowserThreadBundle test_browser_thread_bundle_; 193 content::TestBrowserThreadBundle test_browser_thread_bundle_;
194 base::ScopedTempDir scoped_temp_dir_;
195 PrecacheDatabase* precache_database_;
171 content::TestBrowserContext browser_context_; 196 content::TestBrowserContext browser_context_;
172 PrecacheManagerUnderTest precache_manager_; 197 std::unique_ptr<PrecacheManagerUnderTest> precache_manager_;
173 TestURLFetcherCallback url_callback_; 198 TestURLFetcherCallback url_callback_;
174 net::FakeURLFetcherFactory factory_; 199 net::FakeURLFetcherFactory factory_;
175 TestPrecacheCompletionCallback precache_callback_; 200 TestPrecacheCompletionCallback precache_callback_;
176 testing::NiceMock<MockHistoryService> history_service_; 201 testing::NiceMock<MockHistoryService> history_service_;
177 base::HistogramTester histograms_; 202 base::HistogramTester histograms_;
178 }; 203 };
179 204
180 TEST_F(PrecacheManagerTest, StartAndFinishPrecaching) { 205 TEST_F(PrecacheManagerTest, StartAndFinishPrecaching) {
181 EXPECT_FALSE(precache_manager_.IsPrecaching()); 206 EXPECT_FALSE(precache_manager_->IsPrecaching());
182 207
183 MockHistoryService::TopHostsCallback top_hosts_callback; 208 MockHistoryService::TopHostsCallback top_hosts_callback;
184 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) 209 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _))
185 .WillOnce(SaveArg<1>(&top_hosts_callback)); 210 .WillOnce(SaveArg<1>(&top_hosts_callback));
186 211
187 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 212 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
188 net::URLRequestStatus::SUCCESS); 213 net::URLRequestStatus::SUCCESS);
189 214
190 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 215 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
191 216 base::MessageLoop::current()->RunUntilIdle();
192 EXPECT_TRUE(precache_manager_.IsPrecaching()); 217 EXPECT_TRUE(precache_manager_->IsPrecaching());
193 218
194 top_hosts_callback.Run( 219 top_hosts_callback.Run(
195 history::TopHostsList(1, std::make_pair("good-manifest.com", 1))); 220 history::TopHostsList(1, std::make_pair("good-manifest.com", 1)));
196 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. 221 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher.
197 EXPECT_FALSE(precache_manager_.IsPrecaching()); 222 EXPECT_FALSE(precache_manager_->IsPrecaching());
198 EXPECT_TRUE(precache_callback_.was_on_done_called()); 223 EXPECT_TRUE(precache_callback_.was_on_done_called());
199 224
200 std::multiset<GURL> expected_requested_urls; 225 std::multiset<GURL> expected_requested_urls;
201 expected_requested_urls.insert(GURL(kConfigURL)); 226 expected_requested_urls.insert(GURL(kConfigURL));
202 expected_requested_urls.insert(GURL(kGoodManifestURL)); 227 expected_requested_urls.insert(GURL(kGoodManifestURL));
203 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 228 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
204 } 229 }
205 230
231 TEST_F(PrecacheManagerTest, StartAndFinishPrecachingWithUnfinishedHosts) {
232 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
233 new PrecacheUnfinishedWork());
234 unfinished_work->add_top_host()->set_hostname("evil-manifest.com");
235 unfinished_work->set_start_time(base::Time::Now().ToInternalValue());
236 precache_database_->SaveUnfinishedWork(std::move(unfinished_work));
237
238 EXPECT_FALSE(precache_manager_->IsPrecaching());
239
240 factory_.SetFakeResponse(
241 GURL(kEvilManifestURL), "",
242 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
243
244 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
245 EXPECT_TRUE(precache_manager_->IsPrecaching());
246
247 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher.
248 EXPECT_FALSE(precache_manager_->IsPrecaching());
249 EXPECT_TRUE(precache_callback_.was_on_done_called());
250
251 std::multiset<GURL> expected_requested_urls;
252 expected_requested_urls.insert(GURL(kConfigURL));
253 expected_requested_urls.insert(GURL(kEvilManifestURL));
254 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
255 }
256
257 TEST_F(PrecacheManagerTest,
258 StartAndCancelPrecachingBeforeUnfinishedWorkRetrieved) {
259 EXPECT_FALSE(precache_manager_->IsPrecaching());
260
261 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
262 EXPECT_TRUE(precache_manager_->IsPrecaching());
263 precache_manager_->CancelPrecaching();
264 EXPECT_FALSE(precache_manager_->IsPrecaching());
265
266 base::MessageLoop::current()->RunUntilIdle();
267 EXPECT_FALSE(precache_callback_.was_on_done_called());
268 }
269
206 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeTopHostsCompleted) { 270 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeTopHostsCompleted) {
207 EXPECT_FALSE(precache_manager_.IsPrecaching()); 271 EXPECT_FALSE(precache_manager_->IsPrecaching());
208 272
209 MockHistoryService::TopHostsCallback top_hosts_callback; 273 MockHistoryService::TopHostsCallback top_hosts_callback;
210 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) 274 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _))
211 .WillOnce(SaveArg<1>(&top_hosts_callback)); 275 .WillOnce(SaveArg<1>(&top_hosts_callback));
212 276
213 precache_manager_.SetInControlGroup(true); 277 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
214 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 278 EXPECT_TRUE(precache_manager_->IsPrecaching());
215 EXPECT_TRUE(precache_manager_.IsPrecaching());
216 279
217 precache_manager_.CancelPrecaching(); 280 precache_manager_->CancelPrecaching();
218 EXPECT_FALSE(precache_manager_.IsPrecaching()); 281 EXPECT_FALSE(precache_manager_->IsPrecaching());
282 base::MessageLoop::current()->RunUntilIdle();
219 283
220 top_hosts_callback.Run( 284 top_hosts_callback.Run(
221 history::TopHostsList(1, std::make_pair("starting-url.com", 1))); 285 history::TopHostsList(1, std::make_pair("starting-url.com", 1)));
222 EXPECT_FALSE(precache_manager_.IsPrecaching()); 286 base::MessageLoop::current()->RunUntilIdle();
287 EXPECT_FALSE(precache_manager_->IsPrecaching());
223 EXPECT_FALSE(precache_callback_.was_on_done_called()); 288 EXPECT_FALSE(precache_callback_.was_on_done_called());
224 } 289 }
225 290
226 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeURLsReceived) { 291 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingBeforeURLsReceived) {
227 EXPECT_FALSE(precache_manager_.IsPrecaching()); 292 EXPECT_FALSE(precache_manager_->IsPrecaching());
228 293
229 MockHistoryService::TopHostsCallback top_hosts_callback; 294 MockHistoryService::TopHostsCallback top_hosts_callback;
230 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) 295 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _))
231 .WillOnce(SaveArg<1>(&top_hosts_callback)); 296 .WillOnce(SaveArg<1>(&top_hosts_callback));
232 297
233 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 298 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
234 EXPECT_TRUE(precache_manager_.IsPrecaching()); 299 EXPECT_TRUE(precache_manager_->IsPrecaching());
235 300
236 precache_manager_.CancelPrecaching(); 301 precache_manager_->CancelPrecaching();
237 EXPECT_FALSE(precache_manager_.IsPrecaching()); 302 base::MessageLoop::current()->RunUntilIdle();
238 303 EXPECT_FALSE(precache_manager_->IsPrecaching());
239 top_hosts_callback.Run( 304 top_hosts_callback.Run(
240 history::TopHostsList(1, std::make_pair("starting-url.com", 1))); 305 history::TopHostsList(1, std::make_pair("starting-url.com", 1)));
241 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. 306 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher.
242 EXPECT_FALSE(precache_manager_.IsPrecaching()); 307 EXPECT_FALSE(precache_manager_->IsPrecaching());
243 EXPECT_FALSE(precache_callback_.was_on_done_called()); 308 EXPECT_FALSE(precache_callback_.was_on_done_called());
244 EXPECT_TRUE(url_callback_.requested_urls().empty()); 309 EXPECT_TRUE(url_callback_.requested_urls().empty());
245 } 310 }
246 311
247 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingAfterURLsReceived) { 312 TEST_F(PrecacheManagerTest, StartAndCancelPrecachingAfterURLsReceived) {
248 EXPECT_FALSE(precache_manager_.IsPrecaching()); 313 EXPECT_FALSE(precache_manager_->IsPrecaching());
314
315 PrecacheManifest good_manifest;
316 good_manifest.add_resource()->set_url("http://good-resource.com");
249 317
250 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) 318 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _))
251 .WillOnce(ReturnHosts( 319 .WillOnce(ReturnHosts(
252 history::TopHostsList(1, std::make_pair("starting-url.com", 1)))); 320 history::TopHostsList(1, std::make_pair("starting-url.com", 1))));
253 321
254 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 322 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
255 323
256 // Since the |history_service_| ran the callback immediately, Start() has 324 EXPECT_TRUE(precache_manager_->IsPrecaching());
257 // been called on the PrecacheFetcher, and the precache config settings have 325 // Run a task to get unfinished work, and to get hosts.
258 // been requested. The response has not yet been received though, so 326 for (int i = 0; i < 2; ++i) {
259 // precaching is still in progress. 327 base::RunLoop run_loop;
260 EXPECT_TRUE(precache_manager_.IsPrecaching()); 328 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure());
261 329 run_loop.Run();
262 precache_manager_.CancelPrecaching(); 330 }
263 EXPECT_FALSE(precache_manager_.IsPrecaching()); 331 //base::MessageLoop::current()->RunUntilIdle();
332 precache_manager_->CancelPrecaching();
333 EXPECT_FALSE(precache_manager_->IsPrecaching());
264 334
265 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher. 335 base::MessageLoop::current()->RunUntilIdle(); // For PrecacheFetcher.
266 EXPECT_FALSE(precache_manager_.IsPrecaching()); 336 EXPECT_FALSE(precache_manager_->IsPrecaching());
267 EXPECT_FALSE(precache_callback_.was_on_done_called()); 337 EXPECT_FALSE(precache_callback_.was_on_done_called());
268 338
269 // Even though the response for the precache config settings should not have
270 // been received, the request should still have been made.
271 std::multiset<GURL> expected_requested_urls; 339 std::multiset<GURL> expected_requested_urls;
272 expected_requested_urls.insert(GURL(kConfigURL)); 340 expected_requested_urls.insert(GURL(kConfigURL));
273 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 341 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
274 } 342 }
275 343
276 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithSizeZero) { 344 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithSizeZero) {
277 // Fetches with size 0 should be ignored. 345 // Fetches with size 0 should be ignored.
278 precache_manager_.RecordStatsForFetch(GURL("http://url.com"), GURL(), 346 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(),
279 base::TimeDelta(), base::Time(), 0, 347 base::TimeDelta(), base::Time(), 0,
280 false); 348 false);
281 base::MessageLoop::current()->RunUntilIdle(); 349 base::MessageLoop::current()->RunUntilIdle();
282 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); 350 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty());
283 } 351 }
284 352
285 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithNonHTTP) { 353 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithNonHTTP) {
286 // Fetches for URLs with schemes other than HTTP or HTTPS should be ignored. 354 // Fetches for URLs with schemes other than HTTP or HTTPS should be ignored.
287 precache_manager_.RecordStatsForFetch(GURL("ftp://ftp.com"), GURL(), 355 precache_manager_->RecordStatsForFetch(GURL("ftp://ftp.com"), GURL(),
288 base::TimeDelta(), base::Time(), 1000, 356 base::TimeDelta(), base::Time(), 1000,
289 false); 357 false);
290 base::MessageLoop::current()->RunUntilIdle(); 358 base::MessageLoop::current()->RunUntilIdle();
291 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); 359 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty());
292 } 360 }
293 361
294 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithEmptyURL) { 362 TEST_F(PrecacheManagerTest, RecordStatsForFetchWithEmptyURL) {
295 // Fetches for empty URLs should be ignored. 363 // Fetches for empty URLs should be ignored.
296 precache_manager_.RecordStatsForFetch(GURL(), GURL(), base::TimeDelta(), 364 precache_manager_->RecordStatsForFetch(GURL(), GURL(), base::TimeDelta(),
297 base::Time(), 1000, false); 365 base::Time(), 1000, false);
298 base::MessageLoop::current()->RunUntilIdle(); 366 base::MessageLoop::current()->RunUntilIdle();
299 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty()); 367 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), IsEmpty());
300 } 368 }
301 369
302 TEST_F(PrecacheManagerTest, RecordStatsForFetchDuringPrecaching) { 370 TEST_F(PrecacheManagerTest, RecordStatsForFetchDuringPrecaching) {
303 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) 371 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _))
304 .WillOnce(ReturnHosts(history::TopHostsList())); 372 .WillOnce(ReturnHosts(history::TopHostsList()));
305 373
306 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 374 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
307 375
308 EXPECT_TRUE(precache_manager_.IsPrecaching()); 376 EXPECT_TRUE(precache_manager_->IsPrecaching());
309 precache_manager_.RecordStatsForFetch(GURL("http://url.com"), GURL(), 377 precache_manager_->RecordStatsForFetch(GURL("http://url.com"), GURL(),
310 base::TimeDelta(), base::Time(), 1000, 378 base::TimeDelta(), base::Time(), 1000,
311 false); 379 false);
312 380 base::MessageLoop::current()->RunUntilIdle();
313 precache_manager_.CancelPrecaching(); 381 precache_manager_->CancelPrecaching();
314 382
315 // For PrecacheFetcher and RecordURLPrecached. 383 // For PrecacheFetcher and RecordURLPrecached.
316 base::MessageLoop::current()->RunUntilIdle(); 384 base::MessageLoop::current()->RunUntilIdle();
317 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 385 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
318 ElementsAre(Pair("Precache.DownloadedPrecacheMotivated", 1), 386 ElementsAre(Pair("Precache.DownloadedPrecacheMotivated", 1),
319 Pair("Precache.Fetch.PercentCompleted", 1), 387 Pair("Precache.Fetch.PercentCompleted", 1),
320 Pair("Precache.Fetch.ResponseBytes.Network", 1), 388 Pair("Precache.Fetch.ResponseBytes.Network", 1),
321 Pair("Precache.Fetch.ResponseBytes.Total", 1), 389 Pair("Precache.Fetch.ResponseBytes.Total", 1),
322 Pair("Precache.Fetch.TimeToComplete", 1), 390 Pair("Precache.Fetch.TimeToComplete", 1),
323 Pair("Precache.Latency.Prefetch", 1))); 391 Pair("Precache.Latency.Prefetch", 1)));
324 } 392 }
325 393
326 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTP) { 394 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTP) {
327 precache_manager_.RecordStatsForFetch(GURL("http://http-url.com"), GURL(), 395 precache_manager_->RecordStatsForFetch(GURL("http://http-url.com"), GURL(),
328 base::TimeDelta(), base::Time(), 1000, 396 base::TimeDelta(), base::Time(), 1000,
329 false); 397 false);
330 base::MessageLoop::current()->RunUntilIdle(); 398 base::MessageLoop::current()->RunUntilIdle();
331 399
332 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 400 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
333 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), 401 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1),
334 Pair("Precache.Latency.NonPrefetch", 1), 402 Pair("Precache.Latency.NonPrefetch", 1),
335 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1))); 403 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1)));
336 } 404 }
337 405
338 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTPS) { 406 TEST_F(PrecacheManagerTest, RecordStatsForFetchHTTPS) {
339 precache_manager_.RecordStatsForFetch(GURL("https://https-url.com"), GURL(), 407 precache_manager_->RecordStatsForFetch(GURL("https://https-url.com"), GURL(),
340 base::TimeDelta(), base::Time(), 1000, 408 base::TimeDelta(), base::Time(), 1000,
341 false); 409 false);
342 base::MessageLoop::current()->RunUntilIdle(); 410 base::MessageLoop::current()->RunUntilIdle();
343 411
344 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 412 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
345 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), 413 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1),
346 Pair("Precache.Latency.NonPrefetch", 1), 414 Pair("Precache.Latency.NonPrefetch", 1),
347 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1))); 415 Pair("Precache.Latency.NonPrefetch.NonTopHosts", 1)));
348 } 416 }
349 417
350 TEST_F(PrecacheManagerTest, RecordStatsForFetchInTopHosts) { 418 TEST_F(PrecacheManagerTest, RecordStatsForFetchInTopHosts) {
351 EXPECT_CALL(history_service_, 419 EXPECT_CALL(history_service_,
352 HostRankIfAvailable(GURL("http://referrer.com"), _)) 420 HostRankIfAvailable(GURL("http://referrer.com"), _))
353 .WillOnce(Invoke( 421 .WillOnce(Invoke(
354 [](const GURL& url, const base::Callback<void(int)>& callback) { 422 [](const GURL& url, const base::Callback<void(int)>& callback) {
355 callback.Run(0); 423 callback.Run(0);
356 })); 424 }));
357 precache_manager_.RecordStatsForFetch( 425 precache_manager_->RecordStatsForFetch(
358 GURL("http://http-url.com"), GURL("http://referrer.com"), 426 GURL("http://http-url.com"), GURL("http://referrer.com"),
359 base::TimeDelta(), base::Time(), 1000, false); 427 base::TimeDelta(), base::Time(), 1000, false);
360 base::MessageLoop::current()->RunUntilIdle(); 428 base::MessageLoop::current()->RunUntilIdle();
361 429
362 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 430 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
363 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1), 431 ElementsAre(Pair("Precache.DownloadedNonPrecache", 1),
364 Pair("Precache.Latency.NonPrefetch", 1), 432 Pair("Precache.Latency.NonPrefetch", 1),
365 Pair("Precache.Latency.NonPrefetch.TopHosts", 1))); 433 Pair("Precache.Latency.NonPrefetch.TopHosts", 1)));
366 } 434 }
367 435
368 TEST_F(PrecacheManagerTest, DeleteExpiredPrecacheHistory) { 436 TEST_F(PrecacheManagerTest, DeleteExpiredPrecacheHistory) {
369 // TODO(twifkak): Split this into multiple tests. 437 // TODO(twifkak): Split this into multiple tests.
370 base::HistogramTester::CountsMap expected_histogram_count_map; 438 base::HistogramTester::CountsMap expected_histogram_count_map;
371 439
372 // This test has to use Time::Now() because StartPrecaching uses Time::Now(). 440 // This test has to use Time::Now() because StartPrecaching uses Time::Now().
373 const base::Time kCurrentTime = base::Time::Now(); 441 const base::Time kCurrentTime = base::Time::Now();
374 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _)) 442 EXPECT_CALL(history_service_, TopHosts(NumTopHosts(), _))
375 .Times(2) 443 .Times(2)
376 .WillRepeatedly(ReturnHosts(history::TopHostsList())); 444 .WillRepeatedly(ReturnHosts(history::TopHostsList()));
377 445
378 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 446 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
379 EXPECT_TRUE(precache_manager_.IsPrecaching()); 447 EXPECT_TRUE(precache_manager_->IsPrecaching());
380 448
381 // Precache a bunch of URLs, with different fetch times. 449 // Precache a bunch of URLs, with different fetch times.
382 precache_manager_.RecordStatsForFetch( 450 precache_manager_->RecordStatsForFetch(
383 GURL("http://old-fetch.com"), GURL(), base::TimeDelta(), 451 GURL("http://old-fetch.com"), GURL(), base::TimeDelta(),
384 kCurrentTime - base::TimeDelta::FromDays(61), 1000, false); 452 kCurrentTime - base::TimeDelta::FromDays(61), 1000, false);
385 precache_manager_.RecordStatsForFetch( 453 precache_manager_->RecordStatsForFetch(
386 GURL("http://recent-fetch.com"), GURL(), base::TimeDelta(), 454 GURL("http://recent-fetch.com"), GURL(), base::TimeDelta(),
387 kCurrentTime - base::TimeDelta::FromDays(59), 1000, false); 455 kCurrentTime - base::TimeDelta::FromDays(59), 1000, false);
388 precache_manager_.RecordStatsForFetch( 456 precache_manager_->RecordStatsForFetch(
389 GURL("http://yesterday-fetch.com"), GURL(), base::TimeDelta(), 457 GURL("http://yesterday-fetch.com"), GURL(), base::TimeDelta(),
390 kCurrentTime - base::TimeDelta::FromDays(1), 1000, false); 458 kCurrentTime - base::TimeDelta::FromDays(1), 1000, false);
391 expected_histogram_count_map["Precache.DownloadedPrecacheMotivated"] += 3; 459 expected_histogram_count_map["Precache.DownloadedPrecacheMotivated"] += 3;
392 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; 460 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++;
393 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; 461 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++;
394 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; 462 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++;
395 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; 463 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++;
396 expected_histogram_count_map["Precache.Latency.Prefetch"] += 3; 464 expected_histogram_count_map["Precache.Latency.Prefetch"] += 3;
465 base::MessageLoop::current()->RunUntilIdle();
397 466
398 precache_manager_.CancelPrecaching(); 467 precache_manager_->CancelPrecaching();
468 base::MessageLoop::current()->RunUntilIdle();
469
470 // Disable pause-resume.
471 precache_database_->DeleteUnfinishedWork();
472 base::MessageLoop::current()->RunUntilIdle();
473
399 // For PrecacheFetcher and RecordURLPrecached. 474 // For PrecacheFetcher and RecordURLPrecached.
400 base::MessageLoop::current()->RunUntilIdle(); 475 base::MessageLoop::current()->RunUntilIdle();
401 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 476 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
402 ContainerEq(expected_histogram_count_map)); 477 ContainerEq(expected_histogram_count_map));
403 478
404 // The expired precache will be deleted during precaching this time. 479 // The expired precache will be deleted during precaching this time.
405 precache_manager_.StartPrecaching(precache_callback_.GetCallback()); 480 precache_manager_->StartPrecaching(precache_callback_.GetCallback());
406 EXPECT_TRUE(precache_manager_.IsPrecaching()); 481 EXPECT_TRUE(precache_manager_->IsPrecaching());
482 base::MessageLoop::current()->RunUntilIdle();
483
484 // The precache fetcher runs until done, which records these histograms,
485 // and then cancels precaching, which records these histograms again.
486 // In practice
407 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++; 487 expected_histogram_count_map["Precache.Fetch.PercentCompleted"]++;
408 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++; 488 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Network"]++;
409 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++; 489 expected_histogram_count_map["Precache.Fetch.ResponseBytes.Total"]++;
410
411 precache_manager_.CancelPrecaching();
412 // For PrecacheFetcher and RecordURLPrecached. 490 // For PrecacheFetcher and RecordURLPrecached.
413 base::MessageLoop::current()->RunUntilIdle(); 491 base::MessageLoop::current()->RunUntilIdle();
414 EXPECT_FALSE(precache_manager_.IsPrecaching()); 492 EXPECT_FALSE(precache_manager_->IsPrecaching());
415 493
416 // A fetch for the same URL as the expired precache was served from the cache, 494 // A fetch for the same URL as the expired precache was served from the cache,
417 // but it isn't reported as saved bytes because it had expired in the precache 495 // but it isn't reported as saved bytes because it had expired in the precache
418 // history. 496 // history.
419 precache_manager_.RecordStatsForFetch(GURL("http://old-fetch.com"), GURL(), 497 precache_manager_->RecordStatsForFetch(GURL("http://old-fetch.com"), GURL(),
420 base::TimeDelta(), kCurrentTime, 1000, 498 base::TimeDelta(), kCurrentTime, 1000,
421 true); 499 true);
422 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++; 500 expected_histogram_count_map["Precache.Fetch.TimeToComplete"]++;
423 expected_histogram_count_map["Precache.Latency.NonPrefetch"]++; 501 expected_histogram_count_map["Precache.Latency.NonPrefetch"]++;
424 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"]++; 502 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"]++;
425 503
426 base::MessageLoop::current()->RunUntilIdle(); 504 base::MessageLoop::current()->RunUntilIdle();
427 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 505 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
428 ContainerEq(expected_histogram_count_map)); 506 ContainerEq(expected_histogram_count_map));
429 507
430 // The other precaches should not have expired, so the following fetches from 508 // The other precaches should not have expired, so the following fetches from
431 // the cache should count as saved bytes. 509 // the cache should count as saved bytes.
432 precache_manager_.RecordStatsForFetch(GURL("http://recent-fetch.com"), GURL(), 510 precache_manager_->RecordStatsForFetch(GURL("http://recent-fetch.com"), GURL() ,
433 base::TimeDelta(), kCurrentTime, 1000, 511 base::TimeDelta(), kCurrentTime, 1000,
434 true); 512 true);
435 precache_manager_.RecordStatsForFetch(GURL("http://yesterday-fetch.com"), 513 precache_manager_->RecordStatsForFetch(GURL("http://yesterday-fetch.com"),
436 GURL(), base::TimeDelta(), kCurrentTime, 514 GURL(), base::TimeDelta(), kCurrentTime,
437 1000, true); 515 1000, true);
438 expected_histogram_count_map["Precache.Latency.NonPrefetch"] += 2; 516 expected_histogram_count_map["Precache.Latency.NonPrefetch"] += 2;
439 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"] += 2; 517 expected_histogram_count_map["Precache.Latency.NonPrefetch.NonTopHosts"] += 2;
440 expected_histogram_count_map["Precache.Saved"] += 2; 518 expected_histogram_count_map["Precache.Saved"] += 2;
441 519
442 base::MessageLoop::current()->RunUntilIdle(); 520 base::MessageLoop::current()->RunUntilIdle();
443 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 521 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
444 ContainerEq(expected_histogram_count_map)); 522 ContainerEq(expected_histogram_count_map));
445 } 523 }
446 524
447 } // namespace 525 } // namespace
448 526
449 } // namespace precache 527 } // namespace precache
OLDNEW
« no previous file with comments | « components/precache/content/precache_manager.cc ('k') | components/precache/core/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698