Index: net/proxy/proxy_script_decider_unittest.cc |
diff --git a/net/proxy/proxy_script_decider_unittest.cc b/net/proxy/proxy_script_decider_unittest.cc |
index 977bd4df642b49788221d509273671cb2b4638e2..61978ab6e6bfe0d6b19f4bec182a209f6ca1c4f1 100644 |
--- a/net/proxy/proxy_script_decider_unittest.cc |
+++ b/net/proxy/proxy_script_decider_unittest.cc |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "base/memory/weak_ptr.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
@@ -14,11 +15,13 @@ |
#include "net/base/net_log.h" |
#include "net/base/net_log_unittest.h" |
#include "net/base/test_completion_callback.h" |
+#include "net/dns/mock_host_resolver.h" |
#include "net/proxy/dhcp_proxy_script_fetcher.h" |
#include "net/proxy/proxy_config.h" |
#include "net/proxy/proxy_resolver.h" |
#include "net/proxy/proxy_script_decider.h" |
#include "net/proxy/proxy_script_fetcher.h" |
+#include "net/url_request/url_request_context.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace net { |
@@ -93,7 +96,12 @@ class Rules { |
class RuleBasedProxyScriptFetcher : public ProxyScriptFetcher { |
public: |
- explicit RuleBasedProxyScriptFetcher(const Rules* rules) : rules_(rules) {} |
+ explicit RuleBasedProxyScriptFetcher(const Rules* rules) |
+ : rules_(rules), request_context_(NULL) {} |
+ |
+ virtual void SetRequestContext(URLRequestContext* context) { |
+ request_context_ = context; |
+ } |
// ProxyScriptFetcher implementation. |
virtual int Fetch(const GURL& url, |
@@ -109,10 +117,13 @@ class RuleBasedProxyScriptFetcher : public ProxyScriptFetcher { |
virtual void Cancel() OVERRIDE {} |
- virtual URLRequestContext* GetRequestContext() const OVERRIDE { return NULL; } |
+ virtual URLRequestContext* GetRequestContext() const OVERRIDE { |
+ return request_context_; |
+ } |
private: |
const Rules* rules_; |
+ URLRequestContext* request_context_; |
}; |
// Succeed using custom PAC script. |
@@ -243,6 +254,91 @@ TEST(ProxyScriptDeciderTest, AutodetectSuccess) { |
EXPECT_EQ(rule.url, decider.effective_config().pac_url()); |
} |
+class ProxyScriptDeciderQuickCheckTest : public ::testing::Test { |
+ public: |
+ ProxyScriptDeciderQuickCheckTest() |
+ : rule_(rules_.AddSuccessRule("http://wpad/wpad.dat")), |
+ fetcher_(&rules_) { } |
+ |
+ virtual void SetUp() OVERRIDE { |
+ request_context_.set_host_resolver(&resolver_); |
+ fetcher_.SetRequestContext(&request_context_); |
+ config_.set_auto_detect(true); |
+ decider_.reset(new ProxyScriptDecider(&fetcher_, &dhcp_fetcher_, NULL)); |
+ } |
+ |
+ int StartDecider() { |
+ return decider_->Start(config_, base::TimeDelta(), true, |
+ callback_.callback()); |
+ } |
+ |
+ protected: |
+ scoped_ptr<ProxyScriptDecider> decider_; |
+ MockHostResolver resolver_; |
+ Rules rules_; |
+ Rules::Rule rule_; |
+ TestCompletionCallback callback_; |
+ |
+ private: |
+ URLRequestContext request_context_; |
+ |
+ RuleBasedProxyScriptFetcher fetcher_; |
+ DoNothingDhcpProxyScriptFetcher dhcp_fetcher_; |
+ |
+ ProxyConfig config_; |
+}; |
+ |
+// Fails if a synchronous DNS lookup success for wpad causes QuickCheck to fail. |
+TEST_F(ProxyScriptDeciderQuickCheckTest, SyncSuccess) { |
+ resolver_.set_synchronous_mode(true); |
+ resolver_.rules()->AddRule("wpad", "1.2.3.4"); |
+ |
+ EXPECT_EQ(OK, StartDecider()); |
+ EXPECT_EQ(rule_.text(), decider_->script_data()->utf16()); |
+ |
+ EXPECT_TRUE(decider_->effective_config().has_pac_url()); |
+ EXPECT_EQ(rule_.url, decider_->effective_config().pac_url()); |
+} |
+ |
+// Fails if an asynchronous DNS lookup success for wpad causes QuickCheck to |
+// fail. |
+TEST_F(ProxyScriptDeciderQuickCheckTest, AsyncSuccess) { |
+ resolver_.set_ondemand_mode(true); |
+ resolver_.rules()->AddRule("wpad", "1.2.3.4"); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartDecider()); |
+ ASSERT_TRUE(resolver_.has_pending_requests()); |
+ resolver_.ResolveAllPending(); |
+ callback_.WaitForResult(); |
+ EXPECT_FALSE(resolver_.has_pending_requests()); |
+ EXPECT_EQ(rule_.text(), decider_->script_data()->utf16()); |
+ EXPECT_TRUE(decider_->effective_config().has_pac_url()); |
+ EXPECT_EQ(rule_.url, decider_->effective_config().pac_url()); |
+} |
+ |
+// Fails if an asynchronous DNS lookup failure (i.e. an NXDOMAIN) still causes |
+// ProxyScriptDecider to yield a PAC URL. |
+TEST_F(ProxyScriptDeciderQuickCheckTest, AsyncFail) { |
+ resolver_.set_ondemand_mode(true); |
+ resolver_.rules()->AddSimulatedFailure("wpad"); |
+ EXPECT_EQ(ERR_IO_PENDING, StartDecider()); |
+ ASSERT_TRUE(resolver_.has_pending_requests()); |
+ resolver_.ResolveAllPending(); |
+ callback_.WaitForResult(); |
+ EXPECT_FALSE(decider_->effective_config().has_pac_url()); |
+} |
+ |
+// Fails if a DNS lookup timeout either causes ProxyScriptDecider to yield a PAC |
+// URL or causes ProxyScriptDecider not to cancel its pending resolution. |
+TEST_F(ProxyScriptDeciderQuickCheckTest, AsyncTimeout) { |
+ resolver_.set_ondemand_mode(true); |
+ EXPECT_EQ(ERR_IO_PENDING, StartDecider()); |
+ ASSERT_TRUE(resolver_.has_pending_requests()); |
+ callback_.WaitForResult(); |
+ EXPECT_FALSE(resolver_.has_pending_requests()); |
+ EXPECT_FALSE(decider_->effective_config().has_pac_url()); |
+} |
+ |
// Fails at WPAD (downloading), but succeeds in choosing the custom PAC. |
TEST(ProxyScriptDeciderTest, AutodetectFailCustomSuccess1) { |
Rules rules; |