Index: net/proxy/proxy_resolver_js_bindings_unittest.cc |
=================================================================== |
--- net/proxy/proxy_resolver_js_bindings_unittest.cc (revision 50290) |
+++ net/proxy/proxy_resolver_js_bindings_unittest.cc (working copy) |
@@ -10,6 +10,7 @@ |
#include "net/base/net_util.h" |
#include "net/base/sys_addrinfo.h" |
#include "net/proxy/proxy_resolver_js_bindings.h" |
+#include "net/proxy/proxy_resolver_request_context.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace net { |
@@ -78,6 +79,33 @@ |
} |
}; |
+class MockFailingHostResolver : public HostResolver { |
+ public: |
+ MockFailingHostResolver() : count_(0) {} |
+ |
+ // HostResolver methods: |
+ virtual int Resolve(const RequestInfo& info, |
+ AddressList* addresses, |
+ CompletionCallback* callback, |
+ RequestHandle* out_req, |
+ const BoundNetLog& net_log) { |
+ count_++; |
+ return ERR_NAME_NOT_RESOLVED; |
+ } |
+ |
+ virtual void CancelRequest(RequestHandle req) {} |
+ virtual void AddObserver(Observer* observer) {} |
+ virtual void RemoveObserver(Observer* observer) {} |
+ virtual void Shutdown() {} |
+ |
+ // Returns the number of times Resolve() has been called. |
+ int count() const { return count_; } |
+ void ResetCount() { count_ = 0; } |
+ |
+ private: |
+ int count_; |
+}; |
+ |
TEST(ProxyResolverJSBindingsTest, DnsResolve) { |
scoped_refptr<MockHostResolver> host_resolver(new MockHostResolver); |
@@ -186,5 +214,52 @@ |
bindings->DnsResolveEx("FOO")); |
} |
+TEST(ProxyResolverJSBindingsTest, PerRequestDNSCache) { |
+ scoped_refptr<MockFailingHostResolver> host_resolver( |
+ new MockFailingHostResolver); |
+ |
+ // Get a hold of a DefaultJSBindings* (it is a hidden impl class). |
+ scoped_ptr<ProxyResolverJSBindings> bindings( |
+ ProxyResolverJSBindings::CreateDefault(host_resolver)); |
+ |
+ // Call DnsResolve() 4 times for the same hostname -- this should issue |
+ // 4 separate calls to the underlying host resolver, since there is no |
+ // current request context. |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ(4, host_resolver->count()); |
+ |
+ host_resolver->ResetCount(); |
+ |
+ // Now setup a per-request context, and try the same experiment -- we |
+ // expect the underlying host resolver to receive only 1 request this time, |
+ // since it will service the others from the per-request DNS cache. |
+ HostCache cache(50, |
+ base::TimeDelta::FromMinutes(10), |
+ base::TimeDelta::FromMinutes(10)); |
+ ProxyResolverRequestContext context(NULL, NULL, &cache); |
+ bindings->set_current_request_context(&context); |
+ |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ("", bindings->DnsResolve("foo")); |
+ EXPECT_EQ(1, host_resolver->count()); |
+ |
+ host_resolver->ResetCount(); |
+ |
+ // The "Ex" version shares this same cache, however since the flags |
+ // are different it won't reuse this particular entry. |
+ EXPECT_EQ("", bindings->DnsResolveEx("foo")); |
+ EXPECT_EQ(1, host_resolver->count()); |
+ EXPECT_EQ("", bindings->DnsResolveEx("foo")); |
+ EXPECT_EQ("", bindings->DnsResolveEx("foo")); |
+ EXPECT_EQ(1, host_resolver->count()); |
+ |
+ bindings->set_current_request_context(NULL); |
+} |
+ |
} // namespace |
} // namespace net |