Index: net/proxy/proxy_resolver_v8_unittest.cc |
diff --git a/net/proxy/proxy_resolver_v8_unittest.cc b/net/proxy/proxy_resolver_v8_unittest.cc |
deleted file mode 100644 |
index 76ad232c80518141f24cb95848d89164ff9d081a..0000000000000000000000000000000000000000 |
--- a/net/proxy/proxy_resolver_v8_unittest.cc |
+++ /dev/null |
@@ -1,625 +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 "base/compiler_specific.h" |
-#include "base/files/file_util.h" |
-#include "base/path_service.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/net_log_unittest.h" |
-#include "net/proxy/proxy_info.h" |
-#include "net/proxy/proxy_resolver_v8.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/gurl.h" |
- |
-namespace net { |
-namespace { |
- |
-// Javascript bindings for ProxyResolverV8, which returns mock values. |
-// Each time one of the bindings is called into, we push the input into a |
-// list, for later verification. |
-class MockJSBindings : public ProxyResolverV8::JSBindings { |
- public: |
- MockJSBindings() : my_ip_address_count(0), my_ip_address_ex_count(0), |
- should_terminate(false) {} |
- |
- void Alert(const base::string16& message) override { |
- VLOG(1) << "PAC-alert: " << message; // Helpful when debugging. |
- alerts.push_back(base::UTF16ToUTF8(message)); |
- } |
- |
- bool ResolveDns(const std::string& host, |
- ResolveDnsOperation op, |
- std::string* output, |
- bool* terminate) override { |
- *terminate = should_terminate; |
- |
- if (op == MY_IP_ADDRESS) { |
- my_ip_address_count++; |
- *output = my_ip_address_result; |
- return !my_ip_address_result.empty(); |
- } |
- |
- if (op == MY_IP_ADDRESS_EX) { |
- my_ip_address_ex_count++; |
- *output = my_ip_address_ex_result; |
- return !my_ip_address_ex_result.empty(); |
- } |
- |
- if (op == DNS_RESOLVE) { |
- dns_resolves.push_back(host); |
- *output = dns_resolve_result; |
- return !dns_resolve_result.empty(); |
- } |
- |
- if (op == DNS_RESOLVE_EX) { |
- dns_resolves_ex.push_back(host); |
- *output = dns_resolve_ex_result; |
- return !dns_resolve_ex_result.empty(); |
- } |
- |
- CHECK(false); |
- return false; |
- } |
- |
- void OnError(int line_number, const base::string16& message) override { |
- // Helpful when debugging. |
- VLOG(1) << "PAC-error: [" << line_number << "] " << message; |
- |
- errors.push_back(base::UTF16ToUTF8(message)); |
- errors_line_number.push_back(line_number); |
- } |
- |
- // Mock values to return. |
- std::string my_ip_address_result; |
- std::string my_ip_address_ex_result; |
- std::string dns_resolve_result; |
- std::string dns_resolve_ex_result; |
- |
- // Inputs we got called with. |
- std::vector<std::string> alerts; |
- std::vector<std::string> errors; |
- std::vector<int> errors_line_number; |
- std::vector<std::string> dns_resolves; |
- std::vector<std::string> dns_resolves_ex; |
- int my_ip_address_count; |
- int my_ip_address_ex_count; |
- |
- // Whether ResolveDns() should terminate script execution. |
- bool should_terminate; |
-}; |
- |
-// This is the same as ProxyResolverV8, but it uses mock bindings in place of |
-// the default bindings, and has a helper function to load PAC scripts from |
-// disk. |
-class ProxyResolverV8WithMockBindings : public ProxyResolverV8 { |
- public: |
- ProxyResolverV8WithMockBindings() { |
- set_js_bindings(&mock_js_bindings_); |
- } |
- |
- ~ProxyResolverV8WithMockBindings() override {} |
- |
- MockJSBindings* mock_js_bindings() { |
- return &mock_js_bindings_; |
- } |
- |
- // Initialize with the PAC script data at |filename|. |
- int SetPacScriptFromDisk(const char* filename) { |
- base::FilePath path; |
- PathService::Get(base::DIR_SOURCE_ROOT, &path); |
- path = path.AppendASCII("net"); |
- path = path.AppendASCII("data"); |
- path = path.AppendASCII("proxy_resolver_v8_unittest"); |
- path = path.AppendASCII(filename); |
- |
- // Try to read the file from disk. |
- std::string file_contents; |
- bool ok = base::ReadFileToString(path, &file_contents); |
- |
- // If we can't load the file from disk, something is misconfigured. |
- if (!ok) { |
- LOG(ERROR) << "Failed to read file: " << path.value(); |
- return ERR_UNEXPECTED; |
- } |
- |
- // Load the PAC script into the ProxyResolver. |
- return SetPacScript(ProxyResolverScriptData::FromUTF8(file_contents), |
- CompletionCallback()); |
- } |
- |
- private: |
- MockJSBindings mock_js_bindings_; |
-}; |
- |
-// Doesn't really matter what these values are for many of the tests. |
-const GURL kQueryUrl("http://www.google.com"); |
-const GURL kPacUrl; |
- |
-TEST(ProxyResolverV8Test, Direct) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("direct.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- CapturingBoundNetLog log; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, log.bound()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_TRUE(proxy_info.is_direct()); |
- |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size()); |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size()); |
- |
- net::CapturingNetLog::CapturedEntryList entries; |
- log.GetEntries(&entries); |
- // No bindings were called, so no log entries. |
- EXPECT_EQ(0u, entries.size()); |
-} |
- |
-TEST(ProxyResolverV8Test, ReturnEmptyString) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("return_empty_string.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_TRUE(proxy_info.is_direct()); |
- |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size()); |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size()); |
-} |
- |
-TEST(ProxyResolverV8Test, Basic) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("passthrough.js"); |
- EXPECT_EQ(OK, result); |
- |
- // The "FindProxyForURL" of this PAC script simply concatenates all of the |
- // arguments into a pseudo-host. The purpose of this test is to verify that |
- // the correct arguments are being passed to FindProxyForURL(). |
- { |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL(GURL("http://query.com/path"), &proxy_info, |
- CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(OK, result); |
- EXPECT_EQ("http.query.com.path.query.com:80", |
- proxy_info.proxy_server().ToURI()); |
- } |
- { |
- ProxyInfo proxy_info; |
- int result = resolver.GetProxyForURL( |
- GURL("ftp://query.com:90/path"), &proxy_info, CompletionCallback(), |
- NULL, BoundNetLog()); |
- EXPECT_EQ(OK, result); |
- // Note that FindProxyForURL(url, host) does not expect |host| to contain |
- // the port number. |
- EXPECT_EQ("ftp.query.com.90.path.query.com:80", |
- proxy_info.proxy_server().ToURI()); |
- |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size()); |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size()); |
- } |
-} |
- |
-TEST(ProxyResolverV8Test, BadReturnType) { |
- // These are the filenames of PAC scripts which each return a non-string |
- // types for FindProxyForURL(). They should all fail with |
- // ERR_PAC_SCRIPT_FAILED. |
- static const char* const filenames[] = { |
- "return_undefined.js", |
- "return_integer.js", |
- "return_function.js", |
- "return_object.js", |
- // TODO(eroman): Should 'null' be considered equivalent to "DIRECT" ? |
- "return_null.js" |
- }; |
- |
- for (size_t i = 0; i < arraysize(filenames); ++i) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk(filenames[i]); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); |
- |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- EXPECT_EQ(0U, bindings->alerts.size()); |
- ASSERT_EQ(1U, bindings->errors.size()); |
- EXPECT_EQ("FindProxyForURL() did not return a string.", |
- bindings->errors[0]); |
- EXPECT_EQ(-1, bindings->errors_line_number[0]); |
- } |
-} |
- |
-// Try using a PAC script which defines no "FindProxyForURL" function. |
-TEST(ProxyResolverV8Test, NoEntryPoint) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("no_entrypoint.js"); |
- EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(ERR_FAILED, result); |
-} |
- |
-// Try loading a malformed PAC script. |
-TEST(ProxyResolverV8Test, ParseError) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("missing_close_brace.js"); |
- EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(ERR_FAILED, result); |
- |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- EXPECT_EQ(0U, bindings->alerts.size()); |
- |
- // We get one error during compilation. |
- ASSERT_EQ(1U, bindings->errors.size()); |
- |
- EXPECT_EQ("Uncaught SyntaxError: Unexpected end of input", |
- bindings->errors[0]); |
- EXPECT_EQ(0, bindings->errors_line_number[0]); |
-} |
- |
-// Run a PAC script several times, which has side-effects. |
-TEST(ProxyResolverV8Test, SideEffects) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("side_effects.js"); |
- |
- // The PAC script increments a counter each time we invoke it. |
- for (int i = 0; i < 3; ++i) { |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(OK, result); |
- EXPECT_EQ(base::StringPrintf("sideffect_%d:80", i), |
- proxy_info.proxy_server().ToURI()); |
- } |
- |
- // Reload the script -- the javascript environment should be reset, hence |
- // the counter starts over. |
- result = resolver.SetPacScriptFromDisk("side_effects.js"); |
- EXPECT_EQ(OK, result); |
- |
- for (int i = 0; i < 3; ++i) { |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(OK, result); |
- EXPECT_EQ(base::StringPrintf("sideffect_%d:80", i), |
- proxy_info.proxy_server().ToURI()); |
- } |
-} |
- |
-// Execute a PAC script which throws an exception in FindProxyForURL. |
-TEST(ProxyResolverV8Test, UnhandledException) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("unhandled_exception.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); |
- |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- EXPECT_EQ(0U, bindings->alerts.size()); |
- ASSERT_EQ(1U, bindings->errors.size()); |
- EXPECT_EQ("Uncaught ReferenceError: undefined_variable is not defined", |
- bindings->errors[0]); |
- EXPECT_EQ(3, bindings->errors_line_number[0]); |
-} |
- |
-TEST(ProxyResolverV8Test, ReturnUnicode) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("return_unicode.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- // The result from this resolve was unparseable, because it |
- // wasn't ASCII. |
- EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); |
-} |
- |
-// Test the PAC library functions that we expose in the JS environment. |
-TEST(ProxyResolverV8Test, JavascriptLibrary) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("pac_library_unittest.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- // If the javascript side of this unit-test fails, it will throw a javascript |
- // exception. Otherwise it will return "PROXY success:80". |
- EXPECT_EQ(OK, result); |
- EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); |
- |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size()); |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size()); |
-} |
- |
-// Try resolving when SetPacScriptByData() has not been called. |
-TEST(ProxyResolverV8Test, NoSetPacScript) { |
- ProxyResolverV8WithMockBindings resolver; |
- |
- ProxyInfo proxy_info; |
- |
- // Resolve should fail, as we are not yet initialized with a script. |
- int result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(ERR_FAILED, result); |
- |
- // Initialize it. |
- result = resolver.SetPacScriptFromDisk("direct.js"); |
- EXPECT_EQ(OK, result); |
- |
- // Resolve should now succeed. |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(OK, result); |
- |
- // Clear it, by initializing with an empty string. |
- resolver.SetPacScript( |
- ProxyResolverScriptData::FromUTF16(base::string16()), |
- CompletionCallback()); |
- |
- // Resolve should fail again now. |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(ERR_FAILED, result); |
- |
- // Load a good script once more. |
- result = resolver.SetPacScriptFromDisk("direct.js"); |
- EXPECT_EQ(OK, result); |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- EXPECT_EQ(OK, result); |
- |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size()); |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size()); |
-} |
- |
-// Test marshalling/un-marshalling of values between C++/V8. |
-TEST(ProxyResolverV8Test, V8Bindings) { |
- ProxyResolverV8WithMockBindings resolver; |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- bindings->dns_resolve_result = "127.0.0.1"; |
- int result = resolver.SetPacScriptFromDisk("bindings.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_TRUE(proxy_info.is_direct()); |
- |
- EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size()); |
- |
- // Alert was called 5 times. |
- ASSERT_EQ(5U, bindings->alerts.size()); |
- EXPECT_EQ("undefined", bindings->alerts[0]); |
- EXPECT_EQ("null", bindings->alerts[1]); |
- EXPECT_EQ("undefined", bindings->alerts[2]); |
- EXPECT_EQ("[object Object]", bindings->alerts[3]); |
- EXPECT_EQ("exception from calling toString()", bindings->alerts[4]); |
- |
- // DnsResolve was called 8 times, however only 2 of those were string |
- // parameters. (so 6 of them failed immediately). |
- ASSERT_EQ(2U, bindings->dns_resolves.size()); |
- EXPECT_EQ("", bindings->dns_resolves[0]); |
- EXPECT_EQ("arg1", bindings->dns_resolves[1]); |
- |
- // MyIpAddress was called two times. |
- EXPECT_EQ(2, bindings->my_ip_address_count); |
- |
- // MyIpAddressEx was called once. |
- EXPECT_EQ(1, bindings->my_ip_address_ex_count); |
- |
- // DnsResolveEx was called 2 times. |
- ASSERT_EQ(2U, bindings->dns_resolves_ex.size()); |
- EXPECT_EQ("is_resolvable", bindings->dns_resolves_ex[0]); |
- EXPECT_EQ("foobar", bindings->dns_resolves_ex[1]); |
-} |
- |
-// Test calling a binding (myIpAddress()) from the script's global scope. |
-// http://crbug.com/40026 |
-TEST(ProxyResolverV8Test, BindingCalledDuringInitialization) { |
- ProxyResolverV8WithMockBindings resolver; |
- |
- int result = resolver.SetPacScriptFromDisk("binding_from_global.js"); |
- EXPECT_EQ(OK, result); |
- |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- |
- // myIpAddress() got called during initialization of the script. |
- EXPECT_EQ(1, bindings->my_ip_address_count); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_FALSE(proxy_info.is_direct()); |
- EXPECT_EQ("127.0.0.1:80", proxy_info.proxy_server().ToURI()); |
- |
- // Check that no other bindings were called. |
- EXPECT_EQ(0U, bindings->errors.size()); |
- ASSERT_EQ(0U, bindings->alerts.size()); |
- ASSERT_EQ(0U, bindings->dns_resolves.size()); |
- EXPECT_EQ(0, bindings->my_ip_address_ex_count); |
- ASSERT_EQ(0U, bindings->dns_resolves_ex.size()); |
-} |
- |
-// Try loading a PAC script that ends with a comment and has no terminal |
-// newline. This should not cause problems with the PAC utility functions |
-// that we add to the script's environment. |
-// http://crbug.com/22864 |
-TEST(ProxyResolverV8Test, EndsWithCommentNoNewline) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("ends_with_comment.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_FALSE(proxy_info.is_direct()); |
- EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); |
-} |
- |
-// Try loading a PAC script that ends with a statement and has no terminal |
-// newline. This should not cause problems with the PAC utility functions |
-// that we add to the script's environment. |
-// http://crbug.com/22864 |
-TEST(ProxyResolverV8Test, EndsWithStatementNoNewline) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk( |
- "ends_with_statement_no_semicolon.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_FALSE(proxy_info.is_direct()); |
- EXPECT_EQ("success:3", proxy_info.proxy_server().ToURI()); |
-} |
- |
-// Test the return values from myIpAddress(), myIpAddressEx(), dnsResolve(), |
-// dnsResolveEx(), isResolvable(), isResolvableEx(), when the the binding |
-// returns empty string (failure). This simulates the return values from |
-// those functions when the underlying DNS resolution fails. |
-TEST(ProxyResolverV8Test, DNSResolutionFailure) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("dns_fail.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_FALSE(proxy_info.is_direct()); |
- EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); |
-} |
- |
-TEST(ProxyResolverV8Test, DNSResolutionOfInternationDomainName) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("international_domain_names.js"); |
- EXPECT_EQ(OK, result); |
- |
- // Execute FindProxyForURL(). |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- kQueryUrl, &proxy_info, CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_TRUE(proxy_info.is_direct()); |
- |
- // Check that the international domain name was converted to punycode |
- // before passing it onto the bindings layer. |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- |
- ASSERT_EQ(1u, bindings->dns_resolves.size()); |
- EXPECT_EQ("xn--bcher-kva.ch", bindings->dns_resolves[0]); |
- |
- ASSERT_EQ(1u, bindings->dns_resolves_ex.size()); |
- EXPECT_EQ("xn--bcher-kva.ch", bindings->dns_resolves_ex[0]); |
-} |
- |
-// Test that when resolving a URL which contains an IPv6 string literal, the |
-// brackets are removed from the host before passing it down to the PAC script. |
-// If we don't do this, then subsequent calls to dnsResolveEx(host) will be |
-// doomed to fail since it won't correspond with a valid name. |
-TEST(ProxyResolverV8Test, IPv6HostnamesNotBracketed) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("resolve_host.js"); |
- EXPECT_EQ(OK, result); |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- GURL("http://[abcd::efff]:99/watsupdawg"), &proxy_info, |
- CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_TRUE(proxy_info.is_direct()); |
- |
- // We called dnsResolveEx() exactly once, by passing through the "host" |
- // argument to FindProxyForURL(). The brackets should have been stripped. |
- ASSERT_EQ(1U, resolver.mock_js_bindings()->dns_resolves_ex.size()); |
- EXPECT_EQ("abcd::efff", resolver.mock_js_bindings()->dns_resolves_ex[0]); |
-} |
- |
-// Test that terminating a script within DnsResolve() leads to eventual |
-// termination of the script. Also test that repeatedly calling terminate is |
-// safe, and running the script again after termination still works. |
-TEST(ProxyResolverV8Test, Terminate) { |
- ProxyResolverV8WithMockBindings resolver; |
- int result = resolver.SetPacScriptFromDisk("terminate.js"); |
- EXPECT_EQ(OK, result); |
- |
- MockJSBindings* bindings = resolver.mock_js_bindings(); |
- |
- // Terminate script execution upon reaching dnsResolve(). Note that |
- // termination may not take effect right away (so the subsequent dnsResolve() |
- // and alert() may be run). |
- bindings->should_terminate = true; |
- |
- ProxyInfo proxy_info; |
- result = resolver.GetProxyForURL( |
- GURL("http://hang/"), &proxy_info, |
- CompletionCallback(), NULL, BoundNetLog()); |
- |
- // The script execution was terminated. |
- EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); |
- |
- EXPECT_EQ(1U, resolver.mock_js_bindings()->dns_resolves.size()); |
- EXPECT_GE(2U, resolver.mock_js_bindings()->dns_resolves_ex.size()); |
- EXPECT_GE(1U, bindings->alerts.size()); |
- |
- EXPECT_EQ(1U, bindings->errors.size()); |
- |
- // Termination shows up as an uncaught exception without any message. |
- EXPECT_EQ("", bindings->errors[0]); |
- |
- bindings->errors.clear(); |
- |
- // Try running the script again, this time with a different input which won't |
- // cause a termination+hang. |
- result = resolver.GetProxyForURL( |
- GURL("http://kittens/"), &proxy_info, |
- CompletionCallback(), NULL, BoundNetLog()); |
- |
- EXPECT_EQ(OK, result); |
- EXPECT_EQ(0u, bindings->errors.size()); |
- EXPECT_EQ("kittens:88", proxy_info.proxy_server().ToURI()); |
-} |
- |
-} // namespace |
-} // namespace net |