| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 const Rules::Rule& rule = rules_->GetRuleByUrl(url); | 121 const Rules::Rule& rule = rules_->GetRuleByUrl(url); |
| 122 int rv = rule.fetch_error; | 122 int rv = rule.fetch_error; |
| 123 EXPECT_NE(ERR_UNEXPECTED, rv); | 123 EXPECT_NE(ERR_UNEXPECTED, rv); |
| 124 if (rv == OK) | 124 if (rv == OK) |
| 125 *text = rule.text(); | 125 *text = rule.text(); |
| 126 return rv; | 126 return rv; |
| 127 } | 127 } |
| 128 | 128 |
| 129 void Cancel() override {} | 129 void Cancel() override {} |
| 130 | 130 |
| 131 void OnShutdown() override { request_context_ = nullptr; } |
| 132 |
| 131 URLRequestContext* GetRequestContext() const override { | 133 URLRequestContext* GetRequestContext() const override { |
| 132 return request_context_; | 134 return request_context_; |
| 133 } | 135 } |
| 134 | 136 |
| 135 private: | 137 private: |
| 136 const Rules* rules_; | 138 const Rules* rules_; |
| 137 URLRequestContext* request_context_; | 139 URLRequestContext* request_context_; |
| 138 }; | 140 }; |
| 139 | 141 |
| 140 // A mock retriever, returns asynchronously when CompleteRequests() is called. | 142 // A mock retriever, returns asynchronously when CompleteRequests() is called. |
| 141 class MockDhcpProxyScriptFetcher : public DhcpProxyScriptFetcher { | 143 class MockDhcpProxyScriptFetcher : public DhcpProxyScriptFetcher { |
| 142 public: | 144 public: |
| 143 MockDhcpProxyScriptFetcher(); | 145 MockDhcpProxyScriptFetcher(); |
| 144 ~MockDhcpProxyScriptFetcher() override; | 146 ~MockDhcpProxyScriptFetcher() override; |
| 145 | 147 |
| 146 int Fetch(base::string16* utf16_text, | 148 int Fetch(base::string16* utf16_text, |
| 147 const CompletionCallback& callback) override; | 149 const CompletionCallback& callback) override; |
| 148 void Cancel() override; | 150 void Cancel() override; |
| 151 void OnShutdown() override; |
| 149 const GURL& GetPacURL() const override; | 152 const GURL& GetPacURL() const override; |
| 150 | 153 |
| 151 virtual void SetPacURL(const GURL& url); | 154 virtual void SetPacURL(const GURL& url); |
| 152 | 155 |
| 153 virtual void CompleteRequests(int result, const base::string16& script); | 156 virtual void CompleteRequests(int result, const base::string16& script); |
| 154 | 157 |
| 155 private: | 158 private: |
| 156 CompletionCallback callback_; | 159 CompletionCallback callback_; |
| 157 base::string16* utf16_text_; | 160 base::string16* utf16_text_; |
| 158 GURL gurl_; | 161 GURL gurl_; |
| 159 DISALLOW_COPY_AND_ASSIGN(MockDhcpProxyScriptFetcher); | 162 DISALLOW_COPY_AND_ASSIGN(MockDhcpProxyScriptFetcher); |
| 160 }; | 163 }; |
| 161 | 164 |
| 162 MockDhcpProxyScriptFetcher::MockDhcpProxyScriptFetcher() { } | 165 MockDhcpProxyScriptFetcher::MockDhcpProxyScriptFetcher() { } |
| 163 | 166 |
| 164 MockDhcpProxyScriptFetcher::~MockDhcpProxyScriptFetcher() { } | 167 MockDhcpProxyScriptFetcher::~MockDhcpProxyScriptFetcher() { } |
| 165 | 168 |
| 166 int MockDhcpProxyScriptFetcher::Fetch(base::string16* utf16_text, | 169 int MockDhcpProxyScriptFetcher::Fetch(base::string16* utf16_text, |
| 167 const CompletionCallback& callback) { | 170 const CompletionCallback& callback) { |
| 168 utf16_text_ = utf16_text; | 171 utf16_text_ = utf16_text; |
| 169 callback_ = callback; | 172 callback_ = callback; |
| 170 return ERR_IO_PENDING; | 173 return ERR_IO_PENDING; |
| 171 } | 174 } |
| 172 | 175 |
| 173 void MockDhcpProxyScriptFetcher::Cancel() { } | 176 void MockDhcpProxyScriptFetcher::Cancel() { } |
| 174 | 177 |
| 178 void MockDhcpProxyScriptFetcher::OnShutdown() {} |
| 179 |
| 175 const GURL& MockDhcpProxyScriptFetcher::GetPacURL() const { | 180 const GURL& MockDhcpProxyScriptFetcher::GetPacURL() const { |
| 176 return gurl_; | 181 return gurl_; |
| 177 } | 182 } |
| 178 | 183 |
| 179 void MockDhcpProxyScriptFetcher::SetPacURL(const GURL& url) { | 184 void MockDhcpProxyScriptFetcher::SetPacURL(const GURL& url) { |
| 180 gurl_ = url; | 185 gurl_ = url; |
| 181 } | 186 } |
| 182 | 187 |
| 183 void MockDhcpProxyScriptFetcher::CompleteRequests( | 188 void MockDhcpProxyScriptFetcher::CompleteRequests( |
| 184 int result, const base::string16& script) { | 189 int result, const base::string16& script) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 config_.set_auto_detect(true); | 331 config_.set_auto_detect(true); |
| 327 decider_.reset(new ProxyScriptDecider(&fetcher_, &dhcp_fetcher_, NULL)); | 332 decider_.reset(new ProxyScriptDecider(&fetcher_, &dhcp_fetcher_, NULL)); |
| 328 } | 333 } |
| 329 | 334 |
| 330 int StartDecider() { | 335 int StartDecider() { |
| 331 return decider_->Start(config_, base::TimeDelta(), true, | 336 return decider_->Start(config_, base::TimeDelta(), true, |
| 332 callback_.callback()); | 337 callback_.callback()); |
| 333 } | 338 } |
| 334 | 339 |
| 335 protected: | 340 protected: |
| 336 std::unique_ptr<ProxyScriptDecider> decider_; | |
| 337 MockHostResolver resolver_; | 341 MockHostResolver resolver_; |
| 338 Rules rules_; | 342 Rules rules_; |
| 339 Rules::Rule rule_; | 343 Rules::Rule rule_; |
| 340 TestCompletionCallback callback_; | 344 TestCompletionCallback callback_; |
| 341 RuleBasedProxyScriptFetcher fetcher_; | 345 RuleBasedProxyScriptFetcher fetcher_; |
| 342 ProxyConfig config_; | 346 ProxyConfig config_; |
| 343 DoNothingDhcpProxyScriptFetcher dhcp_fetcher_; | 347 DoNothingDhcpProxyScriptFetcher dhcp_fetcher_; |
| 348 std::unique_ptr<ProxyScriptDecider> decider_; |
| 344 | 349 |
| 345 private: | 350 private: |
| 346 URLRequestContext request_context_; | 351 URLRequestContext request_context_; |
| 347 }; | 352 }; |
| 348 | 353 |
| 349 // Fails if a synchronous DNS lookup success for wpad causes QuickCheck to fail. | 354 // Fails if a synchronous DNS lookup success for wpad causes QuickCheck to fail. |
| 350 TEST_F(ProxyScriptDeciderQuickCheckTest, SyncSuccess) { | 355 TEST_F(ProxyScriptDeciderQuickCheckTest, SyncSuccess) { |
| 351 resolver_.set_synchronous_mode(true); | 356 resolver_.set_synchronous_mode(true); |
| 352 resolver_.rules()->AddRule("wpad", "1.2.3.4"); | 357 resolver_.rules()->AddRule("wpad", "1.2.3.4"); |
| 353 | 358 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 config_.set_pac_url(GURL(kCustomUrl)); | 436 config_.set_pac_url(GURL(kCustomUrl)); |
| 432 Rules::Rule rule = rules_.AddSuccessRule(kCustomUrl); | 437 Rules::Rule rule = rules_.AddSuccessRule(kCustomUrl); |
| 433 resolver_.rules()->AddSimulatedFailure("wpad"); | 438 resolver_.rules()->AddSimulatedFailure("wpad"); |
| 434 resolver_.rules()->AddRule("custom", "1.2.3.4"); | 439 resolver_.rules()->AddRule("custom", "1.2.3.4"); |
| 435 EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); | 440 EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); |
| 436 callback_.WaitForResult(); | 441 callback_.WaitForResult(); |
| 437 EXPECT_TRUE(decider_->effective_config().has_pac_url()); | 442 EXPECT_TRUE(decider_->effective_config().has_pac_url()); |
| 438 EXPECT_EQ(rule.url, decider_->effective_config().pac_url()); | 443 EXPECT_EQ(rule.url, decider_->effective_config().pac_url()); |
| 439 } | 444 } |
| 440 | 445 |
| 446 TEST_F(ProxyScriptDeciderQuickCheckTest, ShutdownDuringResolve) { |
| 447 resolver_.set_ondemand_mode(true); |
| 448 |
| 449 EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); |
| 450 EXPECT_TRUE(resolver_.has_pending_requests()); |
| 451 |
| 452 decider_->OnShutdown(); |
| 453 EXPECT_FALSE(resolver_.has_pending_requests()); |
| 454 EXPECT_EQ(ERR_CONTEXT_SHUT_DOWN, callback_.WaitForResult()); |
| 455 } |
| 456 |
| 441 // Regression test for http://crbug.com/409698. | 457 // Regression test for http://crbug.com/409698. |
| 442 // This test lets the state machine get into state QUICK_CHECK_COMPLETE, then | 458 // This test lets the state machine get into state QUICK_CHECK_COMPLETE, then |
| 443 // destroys the decider, causing a cancel. | 459 // destroys the decider, causing a cancel. |
| 444 TEST_F(ProxyScriptDeciderQuickCheckTest, CancelPartway) { | 460 TEST_F(ProxyScriptDeciderQuickCheckTest, CancelPartway) { |
| 445 resolver_.set_synchronous_mode(false); | 461 resolver_.set_synchronous_mode(false); |
| 446 resolver_.set_ondemand_mode(true); | 462 resolver_.set_ondemand_mode(true); |
| 447 EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); | 463 EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING)); |
| 448 decider_.reset(NULL); | 464 decider_.reset(NULL); |
| 449 } | 465 } |
| 450 | 466 |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 } | 679 } |
| 664 | 680 |
| 665 int Fetch(base::string16* utf16_text, | 681 int Fetch(base::string16* utf16_text, |
| 666 const CompletionCallback& callback) override { | 682 const CompletionCallback& callback) override { |
| 667 *utf16_text = expected_text_; | 683 *utf16_text = expected_text_; |
| 668 return OK; | 684 return OK; |
| 669 } | 685 } |
| 670 | 686 |
| 671 void Cancel() override {} | 687 void Cancel() override {} |
| 672 | 688 |
| 689 void OnShutdown() override {} |
| 690 |
| 673 const GURL& GetPacURL() const override { return gurl_; } | 691 const GURL& GetPacURL() const override { return gurl_; } |
| 674 | 692 |
| 675 const base::string16& expected_text() const { | 693 const base::string16& expected_text() const { |
| 676 return expected_text_; | 694 return expected_text_; |
| 677 } | 695 } |
| 678 | 696 |
| 679 private: | 697 private: |
| 680 GURL gurl_; | 698 GURL gurl_; |
| 681 base::string16 expected_text_; | 699 base::string16 expected_text_; |
| 682 | 700 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 const CompletionCallback& callback) override { | 763 const CompletionCallback& callback) override { |
| 746 callback_ = callback; | 764 callback_ = callback; |
| 747 base::ThreadTaskRunnerHandle::Get()->PostTask( | 765 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 748 FROM_HERE, | 766 FROM_HERE, |
| 749 base::Bind(&AsyncFailDhcpFetcher::CallbackWithFailure, AsWeakPtr())); | 767 base::Bind(&AsyncFailDhcpFetcher::CallbackWithFailure, AsWeakPtr())); |
| 750 return ERR_IO_PENDING; | 768 return ERR_IO_PENDING; |
| 751 } | 769 } |
| 752 | 770 |
| 753 void Cancel() override { callback_.Reset(); } | 771 void Cancel() override { callback_.Reset(); } |
| 754 | 772 |
| 773 void OnShutdown() override {} |
| 774 |
| 755 const GURL& GetPacURL() const override { return dummy_gurl_; } | 775 const GURL& GetPacURL() const override { return dummy_gurl_; } |
| 756 | 776 |
| 757 void CallbackWithFailure() { | 777 void CallbackWithFailure() { |
| 758 if (!callback_.is_null()) | 778 if (!callback_.is_null()) |
| 759 callback_.Run(ERR_PAC_NOT_IN_DHCP); | 779 callback_.Run(ERR_PAC_NOT_IN_DHCP); |
| 760 } | 780 } |
| 761 | 781 |
| 762 private: | 782 private: |
| 763 GURL dummy_gurl_; | 783 GURL dummy_gurl_; |
| 764 CompletionCallback callback_; | 784 CompletionCallback callback_; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 789 | 809 |
| 790 // Run the message loop to let the DHCP fetch complete and post the results | 810 // Run the message loop to let the DHCP fetch complete and post the results |
| 791 // back. Before the fix linked to above, this would try to invoke on | 811 // back. Before the fix linked to above, this would try to invoke on |
| 792 // the callback object provided by ProxyScriptDecider after it was | 812 // the callback object provided by ProxyScriptDecider after it was |
| 793 // no longer valid. | 813 // no longer valid. |
| 794 base::RunLoop().RunUntilIdle(); | 814 base::RunLoop().RunUntilIdle(); |
| 795 } | 815 } |
| 796 | 816 |
| 797 } // namespace | 817 } // namespace |
| 798 } // namespace net | 818 } // namespace net |
| OLD | NEW |