Index: net/proxy/proxy_resolver_v8_tracing_unittest.cc |
diff --git a/net/proxy/proxy_resolver_v8_tracing_unittest.cc b/net/proxy/proxy_resolver_v8_tracing_unittest.cc |
index 888dd18af57d30ddf26219bf0aa4b8166c4a607e..4d2b29660f2e0e684cf91ee508ce52d066f3889e 100644 |
--- a/net/proxy/proxy_resolver_v8_tracing_unittest.cc |
+++ b/net/proxy/proxy_resolver_v8_tracing_unittest.cc |
@@ -12,6 +12,7 @@ |
#include "base/run_loop.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/synchronization/waitable_event.h" |
+#include "base/test/histogram_tester.h" |
#include "base/threading/platform_thread.h" |
#include "base/threading/thread_checker.h" |
#include "base/values.h" |
@@ -37,6 +38,23 @@ class ProxyResolverV8TracingTest : public testing::Test { |
// spilling into the next test's execution. |
base::RunLoop().RunUntilIdle(); |
} |
+ |
+ protected: |
+ // TODO(eroman): Remove when done gathering data for crbug.com/593759 |
+ void ExpectHistogramBucketCount(PacResultForStrippedUrl bucket, |
+ size_t expected_total) { |
+ histograms_.ExpectUniqueSample(kHistogramPacResultForStrippedUrl, |
+ static_cast<int>(bucket), expected_total); |
+ } |
+ |
+ // TODO(eroman): Remove when done gathering data for crbug.com/593759 |
+ void ExpectHistogramTotal(size_t expected_total) { |
+ histograms_.ExpectTotalCount(kHistogramPacResultForStrippedUrl, |
+ expected_total); |
+ } |
+ |
+ private: |
+ base::HistogramTester histograms_; |
}; |
scoped_refptr<ProxyResolverScriptData> LoadScriptData(const char* filename) { |
@@ -160,12 +178,15 @@ TEST_F(ProxyResolverV8TracingTest, Simple) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::SUCCESS, 1); |
+ ExpectHistogramTotal(1); |
+ |
EXPECT_EQ("foo:99", proxy_info.proxy_server().ToURI()); |
EXPECT_EQ(0u, host_resolver.num_resolve()); |
@@ -175,6 +196,36 @@ TEST_F(ProxyResolverV8TracingTest, Simple) { |
EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
} |
+TEST_F(ProxyResolverV8TracingTest, AlertUrl) { |
+ MockCachingHostResolver host_resolver; |
+ MockBindings mock_bindings(&host_resolver); |
+ |
+ scoped_ptr<ProxyResolverV8Tracing> resolver = |
+ CreateResolver(mock_bindings.CreateBindings(), "alert_url.js"); |
+ |
+ TestCompletionCallback callback; |
+ ProxyInfo proxy_info; |
+ |
+ resolver->GetProxyForURL(GURL("https://foo/path"), &proxy_info, |
+ callback.callback(), NULL, |
+ mock_bindings.CreateBindings()); |
+ |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::SUCCESS_DIFFERENT_ALERTS, |
+ 1); |
+ ExpectHistogramTotal(1); |
+ |
+ EXPECT_EQ("foobar:99", proxy_info.proxy_server().ToURI()); |
+ |
+ EXPECT_EQ(0u, host_resolver.num_resolve()); |
+ |
+ // There was 1 alerts and no errors. |
+ EXPECT_EQ(1u, mock_bindings.GetAlerts().size()); |
+ EXPECT_EQ("https://foo/path", mock_bindings.GetAlerts()[0]); |
+ EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
+} |
+ |
TEST_F(ProxyResolverV8TracingTest, JavascriptError) { |
MockCachingHostResolver host_resolver; |
MockBindings mock_bindings(&host_resolver); |
@@ -185,12 +236,14 @@ TEST_F(ProxyResolverV8TracingTest, JavascriptError) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://throw-an-error/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://throw-an-error/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult()); |
+ ExpectHistogramTotal(0); |
+ |
EXPECT_EQ(0u, host_resolver.num_resolve()); |
// Check the output -- there was 1 alert and 1 javascript error. |
@@ -212,12 +265,16 @@ TEST_F(ProxyResolverV8TracingTest, TooManyAlerts) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ ExpectHistogramBucketCount( |
+ PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); |
+ ExpectHistogramTotal(1); |
+ |
// Iteration1 does a DNS resolve |
// Iteration2 exceeds the alert buffer |
// Iteration3 runs in blocking mode and completes |
@@ -248,12 +305,16 @@ TEST_F(ProxyResolverV8TracingTest, TooManyEmptyAlerts) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ ExpectHistogramBucketCount( |
+ PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); |
+ ExpectHistogramTotal(1); |
+ |
EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); |
EXPECT_EQ(1u, host_resolver.num_resolve()); |
@@ -294,12 +355,15 @@ TEST_F(ProxyResolverV8TracingTest, Dns) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::SUCCESS, 1); |
+ ExpectHistogramTotal(1); |
+ |
// The test does 13 DNS resolution, however only 7 of them are unique. |
EXPECT_EQ(7u, host_resolver.num_resolve()); |
@@ -346,12 +410,18 @@ TEST_F(ProxyResolverV8TracingTest, DnsChecksCache) { |
TestCompletionCallback callback2; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foopy/req1"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foopy/req1"), &proxy_info, |
callback1.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback1.WaitForResult()); |
+ // This fails because executing FindProxyForURL() PAC script modifies global |
+ // state each time, changing the result that is returned. |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_DIFFERENT_PROXY_LIST, |
+ 1); |
+ ExpectHistogramTotal(1); |
+ |
// The test does 2 DNS resolutions. |
EXPECT_EQ(2u, host_resolver.num_resolve()); |
@@ -364,10 +434,19 @@ TEST_F(ProxyResolverV8TracingTest, DnsChecksCache) { |
EXPECT_EQ(OK, callback2.WaitForResult()); |
+ // The histograms are unchanged because the second invocation is for an |
+ // http:// URL. |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_DIFFERENT_PROXY_LIST, |
+ 1); |
+ ExpectHistogramTotal(1); |
+ |
EXPECT_EQ(4u, host_resolver.num_resolve()); |
// This time no restarts were required, so g_iteration incremented by 1. |
- EXPECT_EQ("166.155.144.11:4", proxy_info.proxy_server().ToURI()); |
+ // TODO(eroman): Additionally the counter was incremented once by the |
+ // diagnostics code that ran FindProxyForURL() with a stripped URL |
+ // (should really be :4 and not :5). |
+ EXPECT_EQ("166.155.144.11:5", proxy_info.proxy_server().ToURI()); |
// There were no alerts or errors. |
EXPECT_TRUE(mock_bindings.GetAlerts().empty()); |
@@ -391,11 +470,15 @@ TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous1) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ ExpectHistogramBucketCount( |
+ PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); |
+ ExpectHistogramTotal(1); |
+ |
// The script itself only does 2 DNS resolves per execution, however it |
// constructs the hostname using a global counter which changes on each |
// invocation. |
@@ -430,11 +513,15 @@ TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous2) { |
TestCompletionCallback callback; |
ProxyInfo proxy_info; |
- resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
+ resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, |
callback.callback(), NULL, |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ ExpectHistogramBucketCount( |
+ PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); |
+ ExpectHistogramTotal(1); |
+ |
EXPECT_EQ(3u, host_resolver.num_resolve()); |
EXPECT_EQ("166.155.144.44:100", proxy_info.proxy_server().ToURI()); |
@@ -466,6 +553,9 @@ TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence) { |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ // Was not called because this is an http:// URL. |
+ ExpectHistogramTotal(0); |
+ |
EXPECT_EQ(20u, host_resolver.num_resolve()); |
EXPECT_EQ( |
@@ -506,6 +596,9 @@ TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence2) { |
mock_bindings.CreateBindings()); |
EXPECT_EQ(OK, callback.WaitForResult()); |
+ // Was not called because this is an http:// URL. |
+ ExpectHistogramTotal(0); |
+ |
EXPECT_EQ(20u, host_resolver.num_resolve()); |
EXPECT_EQ("null21:34", proxy_info.proxy_server().ToURI()); |
@@ -518,6 +611,94 @@ TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence2) { |
EXPECT_EQ("iteration: 21", mock_bindings.GetAlerts()[0]); |
} |
+TEST_F(ProxyResolverV8TracingTest, DifferentResultBasedOnUrl) { |
+ MockCachingHostResolver host_resolver; |
+ MockBindings mock_bindings(&host_resolver); |
+ |
+ scoped_ptr<ProxyResolverV8Tracing> resolver = |
+ CreateResolver(mock_bindings.CreateBindings(), "return_url_as_proxy.js"); |
+ |
+ TestCompletionCallback callback; |
+ ProxyInfo proxy_info; |
+ |
+ resolver->GetProxyForURL(GURL("https://foo/path1"), &proxy_info, |
+ callback.callback(), NULL, |
+ mock_bindings.CreateBindings()); |
+ |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ |
+ ExpectHistogramTotal(1); |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_DIFFERENT_PROXY_LIST, |
+ 1); |
+ |
+ EXPECT_EQ("httpsx3Ax2Fx2Ffoox2Fpath1:99", proxy_info.proxy_server().ToURI()); |
+ |
+ EXPECT_EQ(0u, host_resolver.num_resolve()); |
+ |
+ // There were no alerts or errors. |
+ EXPECT_TRUE(mock_bindings.GetAlerts().empty()); |
+ EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
+} |
+ |
+TEST_F(ProxyResolverV8TracingTest, ErrorDependingOnUrl) { |
+ MockCachingHostResolver host_resolver; |
+ MockBindings mock_bindings(&host_resolver); |
+ |
+ scoped_ptr<ProxyResolverV8Tracing> resolver = CreateResolver( |
+ mock_bindings.CreateBindings(), "error_depending_on_url.js"); |
+ |
+ TestCompletionCallback callback; |
+ ProxyInfo proxy_info; |
+ |
+ resolver->GetProxyForURL(GURL("https://foo/DontThrowError"), &proxy_info, |
+ callback.callback(), NULL, |
+ mock_bindings.CreateBindings()); |
+ |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ |
+ ExpectHistogramTotal(1); |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_ERROR, 1); |
+ |
+ EXPECT_EQ("foopy:42", proxy_info.proxy_server().ToURI()); |
+ |
+ EXPECT_EQ(0u, host_resolver.num_resolve()); |
+ |
+ // There were no alerts or errors. |
+ EXPECT_TRUE(mock_bindings.GetAlerts().empty()); |
+ EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
+} |
+ |
+TEST_F(ProxyResolverV8TracingTest, DnsDependingOnUrl) { |
+ MockCachingHostResolver host_resolver; |
+ MockBindings mock_bindings(&host_resolver); |
+ |
+ host_resolver.rules()->AddRule("host", "166.155.144.55"); |
+ |
+ // Catch-all that will be used for myIpAddress(). |
+ host_resolver.rules()->AddRule("*", "133.122.100.200"); |
+ |
+ scoped_ptr<ProxyResolverV8Tracing> resolver = |
+ CreateResolver(mock_bindings.CreateBindings(), "dns_depending_on_url.js"); |
+ |
+ TestCompletionCallback callback; |
+ ProxyInfo proxy_info; |
+ |
+ resolver->GetProxyForURL(GURL("https://foo/UseMyIpAddress"), &proxy_info, |
+ callback.callback(), NULL, |
+ mock_bindings.CreateBindings()); |
+ |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ |
+ ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_ABANDONED, 1); |
+ ExpectHistogramTotal(1); |
+ |
+ EXPECT_EQ("foopy:47", proxy_info.proxy_server().ToURI()); |
+ |
+ // No errors. |
+ EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
+ ASSERT_EQ(0u, mock_bindings.GetAlerts().size()); |
+} |
+ |
void DnsDuringInitHelper(bool synchronous_host_resolver) { |
MockCachingHostResolver host_resolver; |
MockBindings mock_bindings(&host_resolver); |