Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 242 size_t num_accepted_connections_needed_; | 242 size_t num_accepted_connections_needed_; |
| 243 base::RunLoop* num_accepted_connections_loop_; | 243 base::RunLoop* num_accepted_connections_loop_; |
| 244 | 244 |
| 245 DISALLOW_COPY_AND_ASSIGN(ConnectionListener); | 245 DISALLOW_COPY_AND_ASSIGN(ConnectionListener); |
| 246 }; | 246 }; |
| 247 | 247 |
| 248 // Records a history of all hostnames for which resolving has been requested, | 248 // Records a history of all hostnames for which resolving has been requested, |
| 249 // and immediately fails the resolution requests themselves. | 249 // and immediately fails the resolution requests themselves. |
| 250 class HostResolutionRequestRecorder : public net::HostResolverProc { | 250 class HostResolutionRequestRecorder : public net::HostResolverProc { |
| 251 public: | 251 public: |
| 252 HostResolutionRequestRecorder() | 252 explicit HostResolutionRequestRecorder(net::HostResolverProc* previous) |
| 253 : HostResolverProc(NULL), | 253 : HostResolverProc(previous), run_loop_(nullptr) {} |
| 254 is_waiting_for_hostname_(false) { | |
| 255 } | |
| 256 | 254 |
| 257 int Resolve(const std::string& host, | 255 int Resolve(const std::string& host, |
| 258 net::AddressFamily address_family, | 256 net::AddressFamily address_family, |
| 259 net::HostResolverFlags host_resolver_flags, | 257 net::HostResolverFlags host_resolver_flags, |
| 260 net::AddressList* addrlist, | 258 net::AddressList* addrlist, |
| 261 int* os_error) override { | 259 int* os_error) override { |
| 260 // Note the rule based proc sleep synchronously. | |
|
Randy Smith (Not in Mondays)
2016/05/23 19:55:18
Sorry, I'm getting past the lexing phase, but fail
Charlie Harrison
2016/05/24 16:57:06
Hahaha yeah that's extremely confusing. I meant th
| |
| 261 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags, | |
| 262 addrlist, os_error); | |
| 262 BrowserThread::PostTask( | 263 BrowserThread::PostTask( |
| 263 BrowserThread::UI, | 264 BrowserThread::IO, FROM_HERE, |
| 264 FROM_HERE, | |
| 265 base::Bind(&HostResolutionRequestRecorder::AddToHistory, | 265 base::Bind(&HostResolutionRequestRecorder::AddToHistory, |
| 266 base::Unretained(this), | 266 base::Unretained(this), host)); |
| 267 host)); | 267 return result; |
| 268 return net::ERR_NAME_NOT_RESOLVED; | |
| 269 } | 268 } |
| 270 | 269 |
| 271 int RequestedHostnameCount() const { | 270 int RequestedHostnameCount() const { |
| 271 base::AutoLock lock(lock_); | |
| 272 return requested_hostnames_.size(); | 272 return requested_hostnames_.size(); |
| 273 } | 273 } |
| 274 | 274 |
| 275 bool HasHostBeenRequested(const std::string& hostname) const { | 275 bool HasHostBeenRequested(const std::string& hostname) const { |
| 276 base::AutoLock lock(lock_); | |
| 277 return HasHostBeenRequestedLocked(hostname); | |
| 278 } | |
| 279 | |
| 280 bool HasHostBeenRequestedLocked(const std::string& hostname) const { | |
| 281 lock_.AssertAcquired(); | |
| 276 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 282 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 277 return std::find(requested_hostnames_.begin(), | 283 return std::find(requested_hostnames_.begin(), |
| 278 requested_hostnames_.end(), | 284 requested_hostnames_.end(), |
| 279 hostname) != requested_hostnames_.end(); | 285 hostname) != requested_hostnames_.end(); |
| 280 } | 286 } |
| 281 | 287 |
| 288 void WaitUntilHostNamesHaveBeenRequested( | |
| 289 const network_hints::UrlList& names) { | |
| 290 for (const auto& name : names) { | |
| 291 WaitUntilHostHasBeenRequested(name.host()); | |
| 292 } | |
| 293 } | |
| 294 | |
| 282 void WaitUntilHostHasBeenRequested(const std::string& hostname) { | 295 void WaitUntilHostHasBeenRequested(const std::string& hostname) { |
| 283 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 296 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 284 DCHECK(!is_waiting_for_hostname_); | 297 base::RunLoop run_loop; |
| 285 if (HasHostBeenRequested(hostname)) | 298 { |
| 286 return; | 299 base::AutoLock lock(lock_); |
| 287 waiting_for_hostname_ = hostname; | 300 if (HasHostBeenRequestedLocked(hostname)) |
| 288 is_waiting_for_hostname_ = true; | 301 return; |
| 289 content::RunMessageLoop(); | 302 waiting_for_hostname_ = hostname; |
| 303 DCHECK(!run_loop_); | |
| 304 run_loop_ = &run_loop; | |
| 305 } | |
| 306 run_loop_->Run(); | |
| 307 } | |
| 308 | |
| 309 void set_task_runner( | |
| 310 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { | |
| 311 task_runner_.swap(task_runner); | |
| 290 } | 312 } |
| 291 | 313 |
| 292 private: | 314 private: |
| 293 ~HostResolutionRequestRecorder() override {} | 315 ~HostResolutionRequestRecorder() override {} |
| 294 | 316 |
| 295 void AddToHistory(const std::string& hostname) { | 317 void AddToHistory(const std::string& hostname) { |
| 296 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 318 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 319 base::AutoLock lock(lock_); | |
| 297 requested_hostnames_.push_back(hostname); | 320 requested_hostnames_.push_back(hostname); |
| 298 if (is_waiting_for_hostname_ && waiting_for_hostname_ == hostname) { | 321 if (run_loop_ && waiting_for_hostname_ == hostname) { |
| 299 is_waiting_for_hostname_ = false; | |
| 300 waiting_for_hostname_.clear(); | 322 waiting_for_hostname_.clear(); |
| 301 base::MessageLoop::current()->QuitWhenIdle(); | 323 task_runner_->PostTask(FROM_HERE, run_loop_->QuitClosure()); |
| 324 run_loop_ = nullptr; | |
| 302 } | 325 } |
| 303 } | 326 } |
| 304 | 327 |
| 305 // The hostname which WaitUntilHostHasBeenRequested is currently waiting for | 328 // The hostname which WaitUntilHostHasBeenRequested is currently waiting for |
| 306 // to be requested. | 329 // to be requested. |
| 307 std::string waiting_for_hostname_; | 330 std::string waiting_for_hostname_; |
| 308 | 331 |
| 309 // Whether WaitUntilHostHasBeenRequested is waiting for a hostname to be | |
| 310 // requested and thus is running a nested message loop. | |
| 311 bool is_waiting_for_hostname_; | |
| 312 | |
| 313 // A list of hostnames for which resolution has already been requested. Only | 332 // A list of hostnames for which resolution has already been requested. Only |
| 314 // to be accessed from the UI thread. | 333 // to be accessed from the UI thread. |
| 315 std::vector<std::string> requested_hostnames_; | 334 std::vector<std::string> requested_hostnames_; |
| 316 | 335 |
| 336 base::RunLoop* run_loop_; | |
| 337 | |
| 338 // Protects |waiting_for_hostname_| and |requested_hostnames_|. | |
| 339 mutable base::Lock lock_; | |
| 340 | |
| 341 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | |
| 342 | |
| 317 DISALLOW_COPY_AND_ASSIGN(HostResolutionRequestRecorder); | 343 DISALLOW_COPY_AND_ASSIGN(HostResolutionRequestRecorder); |
| 318 }; | 344 }; |
| 319 | 345 |
| 320 // This class intercepts URLRequests and responds with the URLRequestJob* | 346 // This class intercepts URLRequests and responds with the URLRequestJob* |
| 321 // callback provided by the constructor. Note that the port of the URL must | 347 // callback provided by the constructor. Note that the port of the URL must |
| 322 // match the port given in the constructor. | 348 // match the port given in the constructor. |
| 323 class MatchingPortRequestInterceptor : public net::URLRequestInterceptor { | 349 class MatchingPortRequestInterceptor : public net::URLRequestInterceptor { |
| 324 public: | 350 public: |
| 325 typedef base::Callback<net::URLRequestJob*(net::URLRequest*, | 351 typedef base::Callback<net::URLRequestJob*(net::URLRequest*, |
| 326 net::NetworkDelegate*)> | 352 net::NetworkDelegate*)> |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 442 } // namespace | 468 } // namespace |
| 443 | 469 |
| 444 namespace chrome_browser_net { | 470 namespace chrome_browser_net { |
| 445 | 471 |
| 446 class PredictorBrowserTest : public InProcessBrowserTest { | 472 class PredictorBrowserTest : public InProcessBrowserTest { |
| 447 public: | 473 public: |
| 448 PredictorBrowserTest() | 474 PredictorBrowserTest() |
| 449 : startup_url_("http://host1:1"), | 475 : startup_url_("http://host1:1"), |
| 450 referring_url_("http://host2:1"), | 476 referring_url_("http://host2:1"), |
| 451 target_url_("http://host3:1"), | 477 target_url_("http://host3:1"), |
| 452 host_resolution_request_recorder_(new HostResolutionRequestRecorder), | 478 rule_based_resolver_proc_(new net::RuleBasedHostResolverProc(nullptr)), |
| 453 cross_site_test_server_(new net::EmbeddedTestServer()) {} | 479 host_resolution_request_recorder_( |
| 480 new HostResolutionRequestRecorder(rule_based_resolver_proc_.get())), | |
| 481 cross_site_test_server_(new net::EmbeddedTestServer()) { | |
| 482 rule_based_resolver_proc_->AddRuleWithLatency("www.example.test", | |
| 483 "127.0.0.1", 50); | |
| 484 rule_based_resolver_proc_->AddRuleWithLatency("gmail.google.com", | |
| 485 "127.0.0.1", 70); | |
| 486 rule_based_resolver_proc_->AddRuleWithLatency("mail.google.com", | |
| 487 "127.0.0.1", 44); | |
| 488 rule_based_resolver_proc_->AddRuleWithLatency("gmail.com", "127.0.0.1", 63); | |
| 489 rule_based_resolver_proc_->AddSimulatedFailure("*.notfound"); | |
| 490 rule_based_resolver_proc_->AddRuleWithLatency("delay.google.com", | |
| 491 "127.0.0.1", 1000 * 60); | |
| 492 } | |
| 454 | 493 |
| 455 protected: | 494 protected: |
| 456 void SetUpInProcessBrowserTestFixture() override { | 495 void SetUpInProcessBrowserTestFixture() override { |
| 457 scoped_host_resolver_proc_.reset(new net::ScopedDefaultHostResolverProc( | 496 scoped_host_resolver_proc_.reset(new net::ScopedDefaultHostResolverProc( |
| 458 host_resolution_request_recorder_.get())); | 497 host_resolution_request_recorder_.get())); |
| 459 InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); | 498 InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); |
| 460 } | 499 } |
| 461 | 500 |
| 462 void SetUpCommandLine(base::CommandLine* command_line) override { | 501 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 463 command_line->AppendSwitch( | 502 command_line->AppendSwitch( |
| 464 switches::kEnableExperimentalWebPlatformFeatures); | 503 switches::kEnableExperimentalWebPlatformFeatures); |
| 465 command_line->AppendSwitchASCII( | 504 command_line->AppendSwitchASCII( |
| 466 switches::kEnableBlinkFeatures, kBlinkPreconnectFeature); | 505 switches::kEnableBlinkFeatures, kBlinkPreconnectFeature); |
| 467 command_line->AppendSwitchASCII(switches::kEnableFeatures, | 506 command_line->AppendSwitchASCII(switches::kEnableFeatures, |
| 468 "PreconnectMore"); | 507 "PreconnectMore"); |
| 508 command_line->AppendSwitchASCII(switches::kEnableFeatures, | |
| 509 "UsePredictorDNSQueue"); | |
| 469 } | 510 } |
| 470 | 511 |
| 471 void SetUpOnMainThread() override { | 512 void SetUpOnMainThread() override { |
| 472 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 513 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 473 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 514 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 515 host_resolution_request_recorder_->set_task_runner(task_runner_); | |
| 474 cross_site_test_server_->ServeFilesFromSourceDirectory("chrome/test/data/"); | 516 cross_site_test_server_->ServeFilesFromSourceDirectory("chrome/test/data/"); |
| 475 | 517 |
| 476 connection_listener_.reset(new ConnectionListener()); | 518 connection_listener_.reset(new ConnectionListener()); |
| 477 cross_site_connection_listener_.reset(new ConnectionListener()); | 519 cross_site_connection_listener_.reset(new ConnectionListener()); |
| 478 embedded_test_server()->SetConnectionListener(connection_listener_.get()); | 520 embedded_test_server()->SetConnectionListener(connection_listener_.get()); |
| 479 cross_site_test_server_->SetConnectionListener( | 521 cross_site_test_server_->SetConnectionListener( |
| 480 cross_site_connection_listener_.get()); | 522 cross_site_connection_listener_.get()); |
| 481 ASSERT_TRUE(embedded_test_server()->Start()); | 523 ASSERT_TRUE(embedded_test_server()->Start()); |
| 482 ASSERT_TRUE(cross_site_test_server_->Start()); | 524 ASSERT_TRUE(cross_site_test_server_->Start()); |
| 483 | 525 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 } | 616 } |
| 575 | 617 |
| 576 bool HasHostBeenRequested(const std::string& hostname) const { | 618 bool HasHostBeenRequested(const std::string& hostname) const { |
| 577 return host_resolution_request_recorder_->HasHostBeenRequested(hostname); | 619 return host_resolution_request_recorder_->HasHostBeenRequested(hostname); |
| 578 } | 620 } |
| 579 | 621 |
| 580 void WaitUntilHostHasBeenRequested(const std::string& hostname) { | 622 void WaitUntilHostHasBeenRequested(const std::string& hostname) { |
| 581 host_resolution_request_recorder_->WaitUntilHostHasBeenRequested(hostname); | 623 host_resolution_request_recorder_->WaitUntilHostHasBeenRequested(hostname); |
| 582 } | 624 } |
| 583 | 625 |
| 626 void WaitUntilHostNamesHaveBeenRequested( | |
| 627 const network_hints::UrlList& names) { | |
| 628 host_resolution_request_recorder_->WaitUntilHostNamesHaveBeenRequested( | |
| 629 names); | |
| 630 } | |
| 631 | |
| 584 int RequestedHostnameCount() const { | 632 int RequestedHostnameCount() const { |
| 585 return host_resolution_request_recorder_->RequestedHostnameCount(); | 633 return host_resolution_request_recorder_->RequestedHostnameCount(); |
| 586 } | 634 } |
| 587 | 635 |
| 636 void FloodResolveRequestsOnUIThread(const network_hints::UrlList& names) { | |
| 637 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 638 BrowserThread::PostTask( | |
| 639 BrowserThread::IO, FROM_HERE, | |
| 640 base::Bind(&PredictorBrowserTest::FloodResolveRequests, this, names)); | |
| 641 } | |
| 642 | |
| 643 void FloodResolveRequests(const network_hints::UrlList& names) { | |
| 644 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 645 for (int i = 0; i < 10; i++) { | |
| 646 predictor()->DnsPrefetchMotivatedList(names, | |
| 647 UrlInfo::PAGE_SCAN_MOTIVATED); | |
| 648 } | |
| 649 } | |
| 650 | |
| 588 net::EmbeddedTestServer* cross_site_test_server() { | 651 net::EmbeddedTestServer* cross_site_test_server() { |
| 589 return cross_site_test_server_.get(); | 652 return cross_site_test_server_.get(); |
| 590 } | 653 } |
| 591 | 654 |
| 592 Predictor* predictor() { return browser()->profile()->GetNetworkPredictor(); } | 655 Predictor* predictor() { return browser()->profile()->GetNetworkPredictor(); } |
| 593 | 656 |
| 594 void InstallPredictorObserver(const GURL& source_host, | 657 void InstallPredictorObserver(const GURL& source_host, |
| 595 const GURL& cross_site_host) { | 658 const GURL& cross_site_host) { |
| 596 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 659 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 597 observer_.reset( | 660 observer_.reset( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 632 base::Unretained(this)), | 695 base::Unretained(this)), |
| 633 run_loop.QuitClosure()); | 696 run_loop.QuitClosure()); |
| 634 run_loop.Run(); | 697 run_loop.Run(); |
| 635 } | 698 } |
| 636 | 699 |
| 637 void FlushServerSocketsOnUIThread(net::EmbeddedTestServer* test_server) { | 700 void FlushServerSocketsOnUIThread(net::EmbeddedTestServer* test_server) { |
| 638 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 701 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 639 EXPECT_TRUE(test_server->FlushAllSocketsAndConnectionsOnUIThread()); | 702 EXPECT_TRUE(test_server->FlushAllSocketsAndConnectionsOnUIThread()); |
| 640 } | 703 } |
| 641 | 704 |
| 705 void ExpectFoundUrlsOnUIThread( | |
| 706 const network_hints::UrlList& found_names, | |
| 707 const network_hints::UrlList& not_found_names) { | |
| 708 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
| 709 base::Bind(&PredictorBrowserTest::ExpectFoundUrls, | |
| 710 this, found_names, not_found_names)); | |
| 711 } | |
| 712 void ExpectFoundUrls(const network_hints::UrlList& found_names, | |
| 713 const network_hints::UrlList& not_found_names) { | |
| 714 for (const auto& name : found_names) { | |
| 715 EXPECT_TRUE(predictor()->WasFound(name)) << "Expected to have found " | |
| 716 << name.spec(); | |
| 717 } | |
| 718 for (const auto& name : not_found_names) { | |
| 719 EXPECT_FALSE(predictor()->WasFound(name)) << "Did not expect to find " | |
| 720 << name.spec(); | |
| 721 } | |
| 722 } | |
| 723 | |
| 724 void DiscardAllResultsOnUIThread() { | |
| 725 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
| 726 base::Bind(&Predictor::DiscardAllResults, | |
| 727 base::Unretained(predictor()))); | |
| 728 } | |
| 729 | |
| 642 CrossSitePredictorObserver* observer() { return observer_.get(); } | 730 CrossSitePredictorObserver* observer() { return observer_.get(); } |
| 643 | 731 |
| 644 // Navigate to an html file on embedded_test_server and tell it to request | 732 // Navigate to an html file on embedded_test_server and tell it to request |
| 645 // |num_cors| resources from the cross_site_test_server. It then waits for | 733 // |num_cors| resources from the cross_site_test_server. It then waits for |
| 646 // those requests to complete. Note that "cors" here means using cors-mode in | 734 // those requests to complete. Note that "cors" here means using cors-mode in |
| 647 // correspondence with the fetch spec. | 735 // correspondence with the fetch spec. |
| 648 void NavigateToCrossSiteHtmlUrl(int num_cors, const char* file_suffix) { | 736 void NavigateToCrossSiteHtmlUrl(int num_cors, const char* file_suffix) { |
| 649 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 737 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 650 const GURL& base_url = cross_site_test_server()->base_url(); | 738 const GURL& base_url = cross_site_test_server()->base_url(); |
| 651 std::string path = base::StringPrintf( | 739 std::string path = base::StringPrintf( |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 662 EXPECT_TRUE(result); | 750 EXPECT_TRUE(result); |
| 663 } | 751 } |
| 664 | 752 |
| 665 const GURL startup_url_; | 753 const GURL startup_url_; |
| 666 const GURL referring_url_; | 754 const GURL referring_url_; |
| 667 const GURL target_url_; | 755 const GURL target_url_; |
| 668 std::unique_ptr<ConnectionListener> connection_listener_; | 756 std::unique_ptr<ConnectionListener> connection_listener_; |
| 669 std::unique_ptr<ConnectionListener> cross_site_connection_listener_; | 757 std::unique_ptr<ConnectionListener> cross_site_connection_listener_; |
| 670 | 758 |
| 671 private: | 759 private: |
| 760 scoped_refptr<net::RuleBasedHostResolverProc> rule_based_resolver_proc_; | |
| 672 scoped_refptr<HostResolutionRequestRecorder> | 761 scoped_refptr<HostResolutionRequestRecorder> |
| 673 host_resolution_request_recorder_; | 762 host_resolution_request_recorder_; |
| 674 std::unique_ptr<net::ScopedDefaultHostResolverProc> | 763 std::unique_ptr<net::ScopedDefaultHostResolverProc> |
| 675 scoped_host_resolver_proc_; | 764 scoped_host_resolver_proc_; |
| 676 std::unique_ptr<net::EmbeddedTestServer> cross_site_test_server_; | 765 std::unique_ptr<net::EmbeddedTestServer> cross_site_test_server_; |
| 677 std::unique_ptr<CrossSitePredictorObserver> observer_; | 766 std::unique_ptr<CrossSitePredictorObserver> observer_; |
| 678 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 767 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 679 }; | 768 }; |
| 680 | 769 |
| 770 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, SingleLookupTest) { | |
| 771 DiscardAllResultsOnUIThread(); | |
| 772 | |
| 773 GURL goog("http://www.example.test:80"); | |
| 774 | |
| 775 network_hints::UrlList names{goog}; | |
| 776 | |
| 777 // Try to flood the predictor with many concurrent requests. | |
| 778 FloodResolveRequestsOnUIThread(names); | |
| 779 WaitUntilHostNamesHaveBeenRequested(names); | |
| 780 base::MessageLoop::current()->RunUntilIdle(); | |
| 781 ExpectFoundUrlsOnUIThread(names, network_hints::UrlList()); | |
| 782 | |
| 783 EXPECT_GT(predictor()->peak_pending_lookups(), names.size() / 2); | |
| 784 EXPECT_LE(predictor()->peak_pending_lookups(), names.size()); | |
| 785 EXPECT_LE(predictor()->peak_pending_lookups(), | |
| 786 predictor()->max_concurrent_dns_lookups()); | |
| 787 } | |
| 788 | |
| 789 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, ConcurrentLookupTest) { | |
| 790 DiscardAllResultsOnUIThread(); | |
| 791 | |
| 792 GURL goog("http://www.example.test:80"), goog2("http://gmail.google.com:80"), | |
| 793 goog3("http://mail.google.com:80"), goog4("http://gmail.com:80"); | |
| 794 GURL bad1("http://bad1.notfound:80"), bad2("http://bad2.notfound:80"); | |
| 795 | |
| 796 UrlList found_names{goog, goog3, goog2, goog4, goog}; | |
| 797 UrlList not_found_names{bad1, bad2}; | |
| 798 | |
| 799 FloodResolveRequestsOnUIThread(found_names); | |
| 800 FloodResolveRequestsOnUIThread(not_found_names); | |
| 801 WaitUntilHostNamesHaveBeenRequested(found_names); | |
| 802 WaitUntilHostNamesHaveBeenRequested(not_found_names); | |
| 803 base::MessageLoop::current()->RunUntilIdle(); | |
| 804 | |
| 805 ExpectFoundUrlsOnUIThread(found_names, not_found_names); | |
| 806 | |
| 807 EXPECT_LE(predictor()->peak_pending_lookups(), | |
| 808 found_names.size() + not_found_names.size()); | |
| 809 EXPECT_LE(predictor()->peak_pending_lookups(), | |
| 810 predictor()->max_concurrent_dns_lookups()); | |
| 811 } | |
| 812 | |
| 813 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, MassiveConcurrentLookupTest) { | |
| 814 DiscardAllResultsOnUIThread(); | |
| 815 UrlList not_found_names; | |
| 816 for (int i = 0; i < 100; i++) { | |
| 817 not_found_names.push_back( | |
| 818 GURL(base::StringPrintf("http://host%d.notfound:80", i))); | |
| 819 } | |
| 820 FloodResolveRequestsOnUIThread(not_found_names); | |
| 821 WaitUntilHostNamesHaveBeenRequested(not_found_names); | |
| 822 base::MessageLoop::current()->RunUntilIdle(); | |
| 823 | |
| 824 ExpectFoundUrlsOnUIThread(network_hints::UrlList(), not_found_names); | |
| 825 | |
| 826 EXPECT_LE(predictor()->peak_pending_lookups(), not_found_names.size()); | |
| 827 | |
| 828 EXPECT_LE(predictor()->peak_pending_lookups(), | |
| 829 predictor()->max_concurrent_dns_lookups()); | |
| 830 } | |
| 831 | |
| 832 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, | |
| 833 ShutdownWhenResolutionIsPendingTest) { | |
| 834 GURL localhost("http://delay.google.com:80"); | |
| 835 UrlList names; | |
| 836 names.push_back(localhost); | |
| 837 | |
| 838 // Flood with delayed requests. | |
| 839 FloodResolveRequestsOnUIThread(names); | |
| 840 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
| 841 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), | |
| 842 base::TimeDelta::FromMilliseconds(500)); | |
| 843 base::MessageLoop::current()->Run(); | |
| 844 | |
| 845 EXPECT_FALSE(predictor()->WasFound(localhost)); | |
| 846 } | |
| 847 | |
| 681 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, SimplePreconnectOne) { | 848 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, SimplePreconnectOne) { |
| 682 predictor()->PreconnectUrl( | 849 predictor()->PreconnectUrl( |
| 683 embedded_test_server()->base_url(), GURL(), | 850 embedded_test_server()->base_url(), GURL(), |
| 684 UrlInfo::ResolutionMotivation::EARLY_LOAD_MOTIVATED, | 851 UrlInfo::ResolutionMotivation::EARLY_LOAD_MOTIVATED, |
| 685 false /* allow credentials */, 1); | 852 false /* allow credentials */, 1); |
| 686 connection_listener_->WaitForAcceptedConnectionsOnUI(1u); | 853 connection_listener_->WaitForAcceptedConnectionsOnUI(1u); |
| 687 } | 854 } |
| 688 | 855 |
| 689 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, SimplePreconnectTwo) { | 856 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, SimplePreconnectTwo) { |
| 690 predictor()->PreconnectUrl( | 857 predictor()->PreconnectUrl( |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1125 EXPECT_THAT(cleared_referral_list, Not(HasSubstr(referring_url_.host()))); | 1292 EXPECT_THAT(cleared_referral_list, Not(HasSubstr(referring_url_.host()))); |
| 1126 EXPECT_THAT(cleared_referral_list, Not(HasSubstr(target_url_.host()))); | 1293 EXPECT_THAT(cleared_referral_list, Not(HasSubstr(target_url_.host()))); |
| 1127 | 1294 |
| 1128 // But also make sure this data has been first loaded into the Predictor, by | 1295 // But also make sure this data has been first loaded into the Predictor, by |
| 1129 // inspecting that the Predictor starts making the expected hostname requests. | 1296 // inspecting that the Predictor starts making the expected hostname requests. |
| 1130 PrepareFrameSubresources(referring_url_); | 1297 PrepareFrameSubresources(referring_url_); |
| 1131 WaitUntilHostHasBeenRequested(startup_url_.host()); | 1298 WaitUntilHostHasBeenRequested(startup_url_.host()); |
| 1132 WaitUntilHostHasBeenRequested(target_url_.host()); | 1299 WaitUntilHostHasBeenRequested(target_url_.host()); |
| 1133 } | 1300 } |
| 1134 | 1301 |
| 1135 // Flaky on Windows: http://crbug.com/469120 | 1302 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, DnsPrefetch) { |
| 1136 #if defined(OS_WIN) | 1303 // Navigate once to make sure all initial hostnames are requested. |
| 1137 #define MAYBE_DnsPrefetch DISABLED_DnsPrefetch | 1304 ui_test_utils::NavigateToURL(browser(), |
| 1138 #else | 1305 embedded_test_server()->GetURL("/title1.html")); |
| 1139 #define MAYBE_DnsPrefetch DnsPrefetch | 1306 |
| 1140 #endif | |
| 1141 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, MAYBE_DnsPrefetch) { | |
| 1142 int hostnames_requested_before_load = RequestedHostnameCount(); | 1307 int hostnames_requested_before_load = RequestedHostnameCount(); |
| 1143 ui_test_utils::NavigateToURL( | 1308 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( |
| 1144 browser(), | 1309 "/predictor/dns_prefetch.html")); |
| 1145 GURL(embedded_test_server()->GetURL("/predictor/dns_prefetch.html"))); | |
| 1146 WaitUntilHostHasBeenRequested(kChromiumHostname); | 1310 WaitUntilHostHasBeenRequested(kChromiumHostname); |
| 1147 ASSERT_FALSE(HasHostBeenRequested(kInvalidLongHostname)); | 1311 ASSERT_FALSE(HasHostBeenRequested(kInvalidLongHostname)); |
| 1148 ASSERT_EQ(hostnames_requested_before_load + 1, RequestedHostnameCount()); | 1312 ASSERT_EQ(hostnames_requested_before_load + 1, RequestedHostnameCount()); |
| 1149 } | 1313 } |
| 1150 | 1314 |
| 1151 // Tests that preconnect warms up a socket connection to a test server. | 1315 // Tests that preconnect warms up a socket connection to a test server. |
| 1152 // Note: This test uses a data URI to serve the preconnect hint, to make sure | 1316 // Note: This test uses a data URI to serve the preconnect hint, to make sure |
| 1153 // that the network stack doesn't just re-use its connection to the test server. | 1317 // that the network stack doesn't just re-use its connection to the test server. |
| 1154 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, PreconnectNonCORS) { | 1318 IN_PROC_BROWSER_TEST_F(PredictorBrowserTest, PreconnectNonCORS) { |
| 1155 GURL preconnect_url = embedded_test_server()->base_url(); | 1319 GURL preconnect_url = embedded_test_server()->base_url(); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1249 // Second navigation to content with an img. | 1413 // Second navigation to content with an img. |
| 1250 std::string img_content = | 1414 std::string img_content = |
| 1251 "<img src=\"" + preconnect_url.spec() + "test.gif\">"; | 1415 "<img src=\"" + preconnect_url.spec() + "test.gif\">"; |
| 1252 NavigateToDataURLWithContent(img_content); | 1416 NavigateToDataURLWithContent(img_content); |
| 1253 connection_listener_->WaitUntilFirstConnectionRead(); | 1417 connection_listener_->WaitUntilFirstConnectionRead(); |
| 1254 EXPECT_EQ(2u, connection_listener_->GetAcceptedSocketCount()); | 1418 EXPECT_EQ(2u, connection_listener_->GetAcceptedSocketCount()); |
| 1255 EXPECT_EQ(1u, connection_listener_->GetReadSocketCount()); | 1419 EXPECT_EQ(1u, connection_listener_->GetReadSocketCount()); |
| 1256 } | 1420 } |
| 1257 | 1421 |
| 1258 } // namespace chrome_browser_net | 1422 } // namespace chrome_browser_net |
| OLD | NEW |