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

Unified Diff: net/proxy/proxy_resolver_js_bindings_unittest.cc

Issue 11885009: Improve performance of proxy resolver by tracing DNS dependencies. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase off trunk Created 7 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: net/proxy/proxy_resolver_js_bindings_unittest.cc
diff --git a/net/proxy/proxy_resolver_js_bindings_unittest.cc b/net/proxy/proxy_resolver_js_bindings_unittest.cc
deleted file mode 100644
index 97d69bf4bbc1bfba35ce22c70b2a2fb45057b393..0000000000000000000000000000000000000000
--- a/net/proxy/proxy_resolver_js_bindings_unittest.cc
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/proxy/proxy_resolver_js_bindings.h"
-
-#include "base/compiler_specific.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/string_util.h"
-#include "net/base/address_list.h"
-#include "net/base/host_cache.h"
-#include "net/base/mock_host_resolver.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_log.h"
-#include "net/base/net_log_unittest.h"
-#include "net/base/net_util.h"
-#include "net/base/test_completion_callback.h"
-#include "net/proxy/proxy_resolver_request_context.h"
-#include "net/proxy/sync_host_resolver.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace {
-
-// This is a HostResolver that synchronously resolves all hosts to the
-// following address list of length 3:
-// 192.168.1.1
-// 172.22.34.1
-// 200.100.1.2
-class MockHostResolverWithMultipleResults : public SyncHostResolver {
- public:
- // HostResolver methods:
- virtual int Resolve(const HostResolver::RequestInfo& info,
- AddressList* addresses,
- const BoundNetLog& bound_net_log) OVERRIDE {
- return ParseAddressList("192.168.1.1,172.22.34.1,200.100.1.2", "",
- addresses);
- }
-
- virtual void Shutdown() OVERRIDE {}
-
- private:
- virtual ~MockHostResolverWithMultipleResults() {}
-};
-
-class MockFailingHostResolver : public SyncHostResolver {
- public:
- MockFailingHostResolver() : count_(0) {}
-
- // HostResolver methods:
- virtual int Resolve(const HostResolver::RequestInfo& info,
- AddressList* addresses,
- const BoundNetLog& bound_net_log) OVERRIDE {
- count_++;
- return ERR_NAME_NOT_RESOLVED;
- }
-
- virtual void Shutdown() OVERRIDE {}
-
- // Returns the number of times Resolve() has been called.
- int count() const { return count_; }
- void ResetCount() { count_ = 0; }
-
- private:
- int count_;
-};
-
-class MockSyncHostResolver : public SyncHostResolver {
- public:
- MockSyncHostResolver() {
- resolver_.set_synchronous_mode(true);
- }
-
- virtual int Resolve(const HostResolver::RequestInfo& info,
- AddressList* addresses,
- const BoundNetLog& bound_net_log) OVERRIDE {
- return resolver_.Resolve(info, addresses, CompletionCallback(), NULL,
- bound_net_log);
- }
-
- virtual void Shutdown() OVERRIDE {}
-
- RuleBasedHostResolverProc* rules() {
- return resolver_.rules();
- }
-
- private:
- MockHostResolver resolver_;
-};
-
-TEST(ProxyResolverJSBindingsTest, DnsResolve) {
- MockSyncHostResolver* host_resolver = new MockSyncHostResolver;
-
- // Get a hold of a DefaultJSBindings* (it is a hidden impl class).
- scoped_ptr<ProxyResolverJSBindings> bindings(
- ProxyResolverJSBindings::CreateDefault(host_resolver, NULL, NULL));
-
- std::string ip_address;
-
- // Empty string is not considered a valid host (even though on some systems
- // requesting this will resolve to localhost).
- host_resolver->rules()->AddSimulatedFailure("");
- EXPECT_FALSE(bindings->DnsResolve("", &ip_address));
-
- // Should call through to the HostResolver.
- host_resolver->rules()->AddRule("google.com", "192.168.1.1");
- EXPECT_TRUE(bindings->DnsResolve("google.com", &ip_address));
- EXPECT_EQ("192.168.1.1", ip_address);
-
- // Resolve failures should give empty string.
- host_resolver->rules()->AddSimulatedFailure("fail");
- EXPECT_FALSE(bindings->DnsResolve("fail", &ip_address));
-
- // TODO(eroman): would be nice to have an IPV6 test here too, but that
- // won't work on all systems.
-}
-
-TEST(ProxyResolverJSBindingsTest, MyIpAddress) {
- MockSyncHostResolver* host_resolver = new MockSyncHostResolver;
-
- // Get a hold of a DefaultJSBindings* (it is a hidden impl class).
- scoped_ptr<ProxyResolverJSBindings> bindings(
- ProxyResolverJSBindings::CreateDefault(host_resolver, NULL, NULL));
-
- // Our IP address is always going to be 127.0.0.1, since we are using a
- // mock host resolver.
- std::string my_ip_address;
- EXPECT_TRUE(bindings->MyIpAddress(&my_ip_address));
-
- EXPECT_EQ("127.0.0.1", my_ip_address);
-}
-
-// Tests that the regular PAC functions restrict results to IPv4,
-// but that the Microsoft extensions to PAC do not. We test this
-// by seeing whether ADDRESS_FAMILY_IPV4 or ADDRESS_FAMILY_UNSPECIFIED
-// was passed into to the host resolver.
-//
-// Restricted to IPv4 address family:
-// myIpAddress()
-// dnsResolve()
-//
-// Unrestricted address family:
-// myIpAddressEx()
-// dnsResolveEx()
-TEST(ProxyResolverJSBindingsTest, RestrictAddressFamily) {
- MockSyncHostResolver* host_resolver = new MockSyncHostResolver;
-
- // Get a hold of a DefaultJSBindings* (it is a hidden impl class).
- scoped_ptr<ProxyResolverJSBindings> bindings(
- ProxyResolverJSBindings::CreateDefault(host_resolver, NULL, NULL));
-
- // Make it so requests resolve to particular address patterns based on family:
- // IPV4_ONLY --> 192.168.1.*
- // UNSPECIFIED --> 192.168.2.1
- host_resolver->rules()->AddRuleForAddressFamily(
- "foo", ADDRESS_FAMILY_IPV4, "192.168.1.1");
- host_resolver->rules()->AddRuleForAddressFamily(
- "*", ADDRESS_FAMILY_IPV4, "192.168.1.2");
- host_resolver->rules()->AddRuleForAddressFamily(
- "foo", ADDRESS_FAMILY_UNSPECIFIED, "192.168.2.1");
- host_resolver->rules()->AddRuleForAddressFamily(
- "*", ADDRESS_FAMILY_UNSPECIFIED, "192.168.2.2");
-
- // Verify that our mock setups works as expected, and we get different results
- // depending if the address family was IPV4_ONLY or not.
- HostResolver::RequestInfo info(HostPortPair("foo", 80));
- AddressList address_list;
- EXPECT_EQ(OK, host_resolver->Resolve(info, &address_list, BoundNetLog()));
- ASSERT_FALSE(address_list.empty());
- EXPECT_EQ("192.168.2.1", address_list.front().ToStringWithoutPort());
-
- info.set_address_family(ADDRESS_FAMILY_IPV4);
- EXPECT_EQ(OK, host_resolver->Resolve(info, &address_list, BoundNetLog()));
- ASSERT_FALSE(address_list.empty());
- EXPECT_EQ("192.168.1.1", address_list.front().ToStringWithoutPort());
-
- std::string ip_address;
- // Now the actual test.
- EXPECT_TRUE(bindings->MyIpAddress(&ip_address));
- EXPECT_EQ("192.168.1.2", ip_address); // IPv4 restricted.
-
- EXPECT_TRUE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_EQ("192.168.1.1", ip_address); // IPv4 restricted.
-
- EXPECT_TRUE(bindings->DnsResolve("foo2", &ip_address));
- EXPECT_EQ("192.168.1.2", ip_address); // IPv4 restricted.
-
- EXPECT_TRUE(bindings->MyIpAddressEx(&ip_address));
- EXPECT_EQ("192.168.2.2", ip_address); // Unrestricted.
-
- EXPECT_TRUE(bindings->DnsResolveEx("foo", &ip_address));
- EXPECT_EQ("192.168.2.1", ip_address); // Unrestricted.
-
- EXPECT_TRUE(bindings->DnsResolveEx("foo2", &ip_address));
- EXPECT_EQ("192.168.2.2", ip_address); // Unrestricted.
-}
-
-// Test that myIpAddressEx() and dnsResolveEx() both return a semi-colon
-// separated list of addresses (as opposed to the non-Ex versions which
-// just return the first result).
-TEST(ProxyResolverJSBindingsTest, ExFunctionsReturnList) {
- SyncHostResolver* host_resolver =
- new MockHostResolverWithMultipleResults;
-
- // Get a hold of a DefaultJSBindings* (it is a hidden impl class).
- scoped_ptr<ProxyResolverJSBindings> bindings(
- ProxyResolverJSBindings::CreateDefault(host_resolver, NULL, NULL));
-
- std::string ip_addresses;
-
- EXPECT_TRUE(bindings->MyIpAddressEx(&ip_addresses));
- EXPECT_EQ("192.168.1.1;172.22.34.1;200.100.1.2", ip_addresses);
-
- EXPECT_TRUE(bindings->DnsResolveEx("FOO", &ip_addresses));
- EXPECT_EQ("192.168.1.1;172.22.34.1;200.100.1.2", ip_addresses);
-}
-
-TEST(ProxyResolverJSBindingsTest, PerRequestDNSCache) {
- 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, NULL, NULL));
-
- std::string ip_address;
-
- // 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_FALSE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- 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.
- const unsigned kMaxCacheEntries = 50;
- HostCache cache(kMaxCacheEntries);
- ProxyResolverRequestContext context(NULL, &cache);
- bindings->set_current_request_context(&context);
-
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolve("foo", &ip_address));
- 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_FALSE(bindings->DnsResolveEx("foo", &ip_address));
- EXPECT_EQ(1, host_resolver->count());
- EXPECT_FALSE(bindings->DnsResolveEx("foo", &ip_address));
- EXPECT_FALSE(bindings->DnsResolveEx("foo", &ip_address));
- EXPECT_EQ(1, host_resolver->count());
-
- bindings->set_current_request_context(NULL);
-}
-
-// Test that when a binding is called, it logs to the per-request NetLog.
-TEST(ProxyResolverJSBindingsTest, NetLog) {
- MockFailingHostResolver* host_resolver = new MockFailingHostResolver;
-
- CapturingNetLog global_log;
-
- // Get a hold of a DefaultJSBindings* (it is a hidden impl class).
- scoped_ptr<ProxyResolverJSBindings> bindings(
- ProxyResolverJSBindings::CreateDefault(
- host_resolver, &global_log, NULL));
-
- // Attach a capturing NetLog as the current request's log stream.
- CapturingNetLog log;
- BoundNetLog bound_log(BoundNetLog::Make(&log, NetLog::SOURCE_NONE));
- ProxyResolverRequestContext context(&bound_log, NULL);
- bindings->set_current_request_context(&context);
-
- std::string ip_address;
- net::CapturingNetLog::CapturedEntryList entries;
- log.GetEntries(&entries);
- ASSERT_EQ(0u, entries.size());
-
- // Call all the bindings. Each call should be logging something to
- // our NetLog.
-
- bindings->MyIpAddress(&ip_address);
-
- log.GetEntries(&entries);
- EXPECT_EQ(2u, entries.size());
- EXPECT_TRUE(LogContainsBeginEvent(
- entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS));
- EXPECT_TRUE(LogContainsEndEvent(
- entries, 1, NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS));
-
- bindings->MyIpAddressEx(&ip_address);
-
- log.GetEntries(&entries);
- EXPECT_EQ(4u, entries.size());
- EXPECT_TRUE(LogContainsBeginEvent(
- entries, 2, NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS_EX));
- EXPECT_TRUE(LogContainsEndEvent(
- entries, 3, NetLog::TYPE_PAC_JAVASCRIPT_MY_IP_ADDRESS_EX));
-
- bindings->DnsResolve("foo", &ip_address);
-
- log.GetEntries(&entries);
- EXPECT_EQ(6u, entries.size());
- EXPECT_TRUE(LogContainsBeginEvent(
- entries, 4, NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE));
- EXPECT_TRUE(LogContainsEndEvent(
- entries, 5, NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE));
-
- bindings->DnsResolveEx("foo", &ip_address);
-
- log.GetEntries(&entries);
- EXPECT_EQ(8u, entries.size());
- EXPECT_TRUE(LogContainsBeginEvent(
- entries, 6, NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE_EX));
- EXPECT_TRUE(LogContainsEndEvent(
- entries, 7, NetLog::TYPE_PAC_JAVASCRIPT_DNS_RESOLVE_EX));
-
- // Nothing has been emitted globally yet.
- net::CapturingNetLog::CapturedEntryList global_log_entries;
- global_log.GetEntries(&global_log_entries);
- EXPECT_EQ(0u, global_log_entries.size());
-
- bindings->OnError(30, string16());
-
- log.GetEntries(&entries);
- EXPECT_EQ(9u, entries.size());
- EXPECT_TRUE(LogContainsEvent(
- entries, 8, NetLog::TYPE_PAC_JAVASCRIPT_ERROR,
- NetLog::PHASE_NONE));
-
- // We also emit errors to the top-level log stream.
- global_log.GetEntries(&global_log_entries);
- EXPECT_EQ(1u, global_log_entries.size());
- EXPECT_TRUE(LogContainsEvent(
- global_log_entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ERROR,
- NetLog::PHASE_NONE));
-
- bindings->Alert(string16());
-
- log.GetEntries(&entries);
- EXPECT_EQ(10u, entries.size());
- EXPECT_TRUE(LogContainsEvent(
- entries, 9, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
- NetLog::PHASE_NONE));
-
- // We also emit javascript alerts to the top-level log stream.
- global_log.GetEntries(&global_log_entries);
- EXPECT_EQ(2u, global_log_entries.size());
- EXPECT_TRUE(LogContainsEvent(
- global_log_entries, 1, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
- NetLog::PHASE_NONE));
-}
-
-} // namespace
-
-} // namespace net

Powered by Google App Engine
This is Rietveld 408576698