12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_resolver_v8_tracing.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/waitable_event.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/platform_thread.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_errors.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_log.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_log_unittest.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/test_completion_callback.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/host_cache.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_info.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_resolver_error_observer.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProxyResolverV8TracingTest : public testing::Test { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Drain any pending messages, which may be left over from cancellation. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This way they get reliably run as part of the current test, rather than 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // spilling into the next test's execution. 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<ProxyResolverScriptData> LoadScriptData(const char* filename) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path = path.AppendASCII("net"); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path = path.AppendASCII("data"); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path = path.AppendASCII("proxy_resolver_v8_tracing_unittest"); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path = path.AppendASCII(filename); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to read the file from disk. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string file_contents; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ok = file_util::ReadFileToString(path, &file_contents); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we can't load the file from disk, something is misconfigured. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ok) << "Failed to read file: " << path.value(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Load the PAC script into the ProxyResolver. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ProxyResolverScriptData::FromUTF8(file_contents); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InitResolver(ProxyResolverV8Tracing* resolver, const char* filename) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver->SetPacScript(LoadScriptData(filename), callback.callback()); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockErrorObserver : public ProxyResolverErrorObserver { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver() : event_(true, false) {} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPACScriptError(int line_number, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& error) OVERRIDE { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock l(lock_); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output += base::StringPrintf("Error: line %d: %s\n", line_number, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UTF16ToASCII(error).c_str()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_.Signal(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetOutput() { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock l(lock_); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return output; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForOutput() { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_.Wait(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Lock lock_; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string output; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WaitableEvent event_; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, Simple) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "simple.js"); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, callback.callback(), 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, request_log.bound()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("foo:99", proxy_info.proxy_server().ToURI()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, host_resolver.num_resolve()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There were no errors. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- nothing was logged. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, log.GetSize()); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, request_log.GetSize()); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, JavascriptError) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "error.js"); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://throw-an-error/"), &proxy_info, callback.callback(), NULL, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult()); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, host_resolver.num_resolve()); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("Error: line 5: Uncaught TypeError: Cannot call method 'split' " 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "of null\n", error_observer->GetOutput()); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- there was 1 alert and 1 javascript error, and they 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // were output to both the global log, and per-request log. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog::CapturedEntryList entries_list[2]; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log.GetEntries(&entries_list[0]); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.GetEntries(&entries_list[1]); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i]; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, entries.size()); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, 1, NetLog::TYPE_PAC_JAVASCRIPT_ERROR, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("{\"message\":\"Prepare to DIE!\"}", entries[0].GetParamsJson()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("{\"line_number\":5,\"message\":\"Uncaught TypeError: Cannot " 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "call method 'split' of null\"}", entries[1].GetParamsJson()); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, TooManyAlerts) { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "too_many_alerts.js"); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &proxy_info, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iteration1 does a DNS resolve 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iteration2 exceeds the alert buffer 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iteration3 runs in blocking mode and completes 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, host_resolver.num_resolve()); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- the script generated 50 alerts, which were mirrored 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to both the global and per-request logs. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog::CapturedEntryList entries_list[2]; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log.GetEntries(&entries_list[0]); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.GetEntries(&entries_list[1]); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i]; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(50u, entries.size()); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, i, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that buffered alerts cannot grow unboundedly, even when the message is 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// empty string. 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, TooManyEmptyAlerts) { 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "too_many_empty_alerts.js"); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &proxy_info, 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, host_resolver.num_resolve()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- the script generated 50 alerts, which were mirrored 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to both the global and per-request logs. 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog::CapturedEntryList entries_list[2]; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log.GetEntries(&entries_list[0]); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.GetEntries(&entries_list[1]); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) { 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i]; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1000u, entries.size()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, i, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a PAC script that issues a sequence of DNS resolves. The test 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies the final result, and that the underlying DNS resolver received 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the correct set of queries. 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, Dns) { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRuleForAddressFamily( 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "host1", ADDRESS_FAMILY_IPV4, "166.155.144.44"); 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_resolver.rules() 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->AddIPLiteralRule("host1", "::1,192.168.1.1", std::string()); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("host2"); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host3", "166.155.144.33"); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host5", "166.155.144.55"); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("host6"); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRuleForAddressFamily( 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "*", ADDRESS_FAMILY_IPV4, "122.133.144.155"); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("*", "133.122.100.200"); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns.js"); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &proxy_info, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test does 13 DNS resolution, however only 7 of them are unique. 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(7u, host_resolver.num_resolve()); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* kExpectedResult = 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "122.133.144.155-" // myIpAddress() 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null-" // dnsResolve('') 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "__1_192.168.1.1-" // dnsResolveEx('host1') 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null-" // dnsResolve('host2') 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.33-" // dnsResolve('host3') 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "122.133.144.155-" // myIpAddress() 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.33-" // dnsResolve('host3') 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "__1_192.168.1.1-" // dnsResolveEx('host1') 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "122.133.144.155-" // myIpAddress() 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null-" // dnsResolve('host2') 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "-" // dnsResolveEx('host6') 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "133.122.100.200-" // myIpAddressEx() 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.44" // dnsResolve('host1') 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ":99"; 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kExpectedResult, proxy_info.proxy_server().ToURI()); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- the script generated 1 alert, mirrored to both 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the per-request and global logs. 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog::CapturedEntryList entries_list[2]; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log.GetEntries(&entries_list[0]); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.GetEntries(&entries_list[1]); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i]; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, entries.size()); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("{\"message\":\"iteration: 7\"}", entries[0].GetParamsJson()); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a PAC script that does "myIpAddress()" followed by 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "dnsResolve()". This requires 2 restarts. However once the HostResolver's 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cache is warmed, subsequent calls should take 0 restarts. 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, DnsChecksCache) { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("foopy", "166.155.144.11"); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("*", "122.133.144.155"); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "simple_dns.js"); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback1; 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback2; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foopy/req1"), 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &proxy_info, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback1.callback(), 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback1.WaitForResult()); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test does 2 DNS resolutions. 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, host_resolver.num_resolve()); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first request took 2 restarts, hence on g_iteration=3. 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("166.155.144.11:3", proxy_info.proxy_server().ToURI()); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = resolver.GetProxyForURL( 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foopy/req2"), 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &proxy_info, 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback2.callback(), 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback2.WaitForResult()); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4u, host_resolver.num_resolve()); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This time no restarts were required, so g_iteration incremented by 1. 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("166.155.144.11:4", proxy_info.proxy_server().ToURI()); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, log.GetSize()); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, request_log.GetSize()); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that was designed to defeat the DNS tracing 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// optimization. The proxy resolver should detect the inconsistency and 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fall-back to synchronous mode execution. 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous1) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host1", "166.155.144.11"); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("crazy4", "133.199.111.4"); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("*", "122.133.144.155"); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "global_sideffects1.js"); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, callback.callback(), NULL, 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The script itself only does 2 DNS resolves per execution, however it 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // constructs the hostname using a global counter which changes on each 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // invocation. 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, host_resolver.num_resolve()); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("166.155.144.11-133.199.111.4:100", 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_info.proxy_server().ToURI()); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- the script generated 1 alert, mirrored to both 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the per-request and global logs. 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog::CapturedEntryList entries_list[2]; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log.GetEntries(&entries_list[0]); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.GetEntries(&entries_list[1]); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i]; 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, entries.size()); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("{\"message\":\"iteration: 4\"}", entries[0].GetParamsJson()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that was designed to defeat the DNS tracing 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// optimization. The proxy resolver should detect the inconsistency and 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fall-back to synchronous mode execution. 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous2) { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host1", "166.155.144.11"); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host2", "166.155.144.22"); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host3", "166.155.144.33"); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host4", "166.155.144.44"); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("*", "122.133.144.155"); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "global_sideffects2.js"); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, callback.callback(), NULL, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, host_resolver.num_resolve()); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("166.155.144.44:100", proxy_info.proxy_server().ToURI()); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- nothing was logged. 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, log.GetSize()); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, request_log.GetSize()); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that yields a never ending sequence 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of DNS resolves when restarting. Running it will hit the maximum 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DNS resolves per request limit (20) after which every DNS resolve will 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fail. 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence) { 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host*", "166.155.144.11"); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("*", "122.133.144.155"); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "global_sideffects3.js"); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, callback.callback(), NULL, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(20u, host_resolver.num_resolve()); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ( 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null:21", proxy_info.proxy_server().ToURI()); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- 1 alert was logged. 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, log.GetSize()); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, request_log.GetSize()); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that yields a never ending sequence 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of DNS resolves when restarting. Running it will hit the maximum 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DNS resolves per request limit (20) after which every DNS resolve will 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fail. 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence2) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host*", "166.155.144.11"); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("*", "122.133.144.155"); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "global_sideffects4.js"); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, callback.callback(), NULL, 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(20u, host_resolver.num_resolve()); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("null21:34", proxy_info.proxy_server().ToURI()); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- 1 alert was logged. 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, log.GetSize()); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, request_log.GetSize()); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DnsDuringInitHelper(bool synchronous_host_resolver) { 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.set_synchronous_mode(synchronous_host_resolver); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host1", "91.13.12.1"); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host2", "91.13.12.2"); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns_during_init.js"); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialization did 2 dnsResolves. 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, host_resolver.num_resolve()); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->ClearRules(); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.GetHostCache()->clear(); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host1", "145.88.13.3"); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host2", "137.89.8.45"); 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, callback.callback(), NULL, 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fetched host1 and host2 again, since the ones done during initialization 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should not have been cached. 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4u, host_resolver.num_resolve()); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("91.13.12.1-91.13.12.2-145.88.13.3-137.89.8.45:99", 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_info.proxy_server().ToURI()); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the NetLogs -- the script generated 2 alerts during initialization. 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, request_log.GetSize()); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log.GetEntries(&entries); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, entries.size()); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LogContainsEvent(entries, 1, NetLog::TYPE_PAC_JAVASCRIPT_ALERT, 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog::PHASE_NONE)); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("{\"message\":\"Watsup\"}", entries[0].GetParamsJson()); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("{\"message\":\"Watsup2\"}", entries[1].GetParamsJson()); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests a PAC script which does DNS resolves during initialization. 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, DnsDuringInit) { 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test with both both a host resolver that always completes asynchronously, 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and then again with one that completes synchronously. 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DnsDuringInitHelper(false); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DnsDuringInitHelper(true); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CrashCallback(int) { 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Be extra sure that if the callback ever gets invoked, the test will fail. 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(false); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Start some requests, cancel them all, and then destroy the resolver. 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note the execution order for this test can vary. Since multiple 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// threads are involved, the cancellation may be received a different 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// times. 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelAll) { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("*"); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns.js"); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t kNumRequests = 5; 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info[kNumRequests]; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request[kNumRequests]; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kNumRequests; ++i) { 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info[i], 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request[i], BoundNetLog()); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kNumRequests; ++i) { 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelRequest(request[i]); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note the execution order for this test can vary. Since multiple 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// threads are involved, the cancellation may be received a different 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// times. 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelSome) { 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("*"); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns.js"); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info1; 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info2; 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request1; 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request2; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info1, 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request1, BoundNetLog()); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = resolver.GetProxyForURL( 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info2, 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), &request2, BoundNetLog()); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelRequest(request1); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancel a request after it has finished running on the worker thread, and has 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// posted a task the completion task back to origin thread. 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhilePendingCompletionTask) { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("*"); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "error.js"); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info1; 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info2; 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info3; 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request1; 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request2; 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request3; 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info1, 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request1, BoundNetLog()); 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = resolver.GetProxyForURL( 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://throw-an-error/"), &proxy_info2, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), &request2, BoundNetLog()); 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait until the first request has finished running on the worker thread. 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (The second request will output an error). 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_observer->WaitForOutput(); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cancel the first request, while it has a pending completion task on 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the origin thread. 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelRequest(request1); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult()); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start another request, to make sure it is able to complete. 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = resolver.GetProxyForURL( 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://i-have-no-idea-what-im-doing/"), &proxy_info3, 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), &request3, BoundNetLog()); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("i-approve-this-message:42", 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_info3.proxy_server().ToURI()); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This implementation of HostResolver allows blocking until a resolve request 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// has been received. The resolve requests it receives will never be completed. 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BlockableHostResolver : public HostResolver { 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockableHostResolver() 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : num_cancelled_requests_(0), waiting_for_resolve_(false) {} 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int Resolve(const RequestInfo& info, 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddressList* addresses, 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback, 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestHandle* out_req, 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log) OVERRIDE { 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(callback.is_null()); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(out_req); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!action_.is_null()) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_.Run(); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicate to the caller that a request was received. 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(waiting_for_resolve_); 77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This line is intentionally after action_.Run(), since one of the 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tests does a cancellation inside of Resolve(), and it is more 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // interesting if *out_req hasn't been written yet at that point. 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out_req = reinterpret_cast<RequestHandle*>(1); // Magic value. 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return ERR_IO_PENDING as this request will NEVER be completed. 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expectation is for the caller to later cancel the request. 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ERR_IO_PENDING; 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int ResolveFromCache(const RequestInfo& info, 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddressList* addresses, 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log) OVERRIDE { 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ERR_DNS_CACHE_MISS; 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelRequest(RequestHandle req) OVERRIDE { 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(reinterpret_cast<RequestHandle*>(1), req); 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_cancelled_requests_++; 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetAction(const base::Callback<void(void)>& action) { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_ = action; 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Waits until Resolve() has been called. 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitUntilRequestIsReceived() { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_resolve_ = true; 81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(waiting_for_resolve_); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waiting_for_resolve_ = false; 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_cancelled_requests() const { 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return num_cancelled_requests_; 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_cancelled_requests_; 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool waiting_for_resolve_; 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Callback<void(void)> action_; 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This cancellation test exercises a more predictable cancellation codepath -- 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when the request has an outstanding DNS request in flight. 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhileOutstandingNonBlockingDns) { 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockableHostResolver host_resolver; 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns.js"); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info1; 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info2; 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request1; 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request2; 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/req1"), &proxy_info1, 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request1, BoundNetLog()); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.WaitUntilRequestIsReceived(); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = resolver.GetProxyForURL( 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/req2"), &proxy_info2, 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request2, BoundNetLog()); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.WaitUntilRequestIsReceived(); 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelRequest(request1); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelRequest(request2); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, host_resolver.num_cancelled_requests()); 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // After leaving this scope, the ProxyResolver is destroyed. 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should not cause any problems, as the outstanding work 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should have been cancelled. 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CancelRequestAndPause(ProxyResolverV8Tracing* resolver, 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request) { 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver->CancelRequest(request); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sleep for a little bit. This makes it more likely for the worker 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread to have returned from its call, and serves as a regression 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test for http://crbug.com/173373. 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(30)); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// In non-blocking mode, the worker thread actually does block for 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a short time to see if the result is in the DNS cache. Test 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cancellation while the worker thread is waiting on this event. 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhileBlockedInNonBlockingDns) { 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockableHostResolver host_resolver; 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns.js"); 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request; 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request, BoundNetLog()); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.SetAction( 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(CancelRequestAndPause, &resolver, request)); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.WaitUntilRequestIsReceived(); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // At this point the host resolver ran Resolve(), and should have cancelled 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the request. 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, host_resolver.num_cancelled_requests()); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancel the request while there is a pending DNS request, however before 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the request is sent to the host resolver. 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhileBlockedInNonBlockingDns2) { 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "dns.js"); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolver::RequestHandle request; 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info, 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback), &request, BoundNetLog()); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait a bit, so the DNS task has hopefully been posted. The test will 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // work whatever the delay is here, but it is most useful if the delay 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is large enough to allow a task to be posted back. 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelRequest(request); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, host_resolver.num_resolve()); 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelSetPacWhileOutstandingBlockingDns) { 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockableHostResolver host_resolver; 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.SetPacScript(LoadScriptData("dns_during_init.js"), 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CrashCallback)); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.WaitUntilRequestIsReceived(); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resolver.CancelSetPacScript(); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, host_resolver.num_cancelled_requests()); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This tests that the execution of a PAC script is terminated when the DNS 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// dependencies are missing. If the test fails, then it will hang. 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, Terminate) { 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog log; 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingBoundNetLog request_log; 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCachingHostResolver host_resolver; 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockErrorObserver* error_observer = new MockErrorObserver; 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host1", "182.111.0.222"); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver.rules()->AddRule("host2", "111.33.44.55"); 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver, "terminate.js"); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback; 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info; 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver.GetProxyForURL( 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foopy/req1"), 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &proxy_info, 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.callback(), 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_log.bound()); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test does 2 DNS resolutions. 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, host_resolver.num_resolve()); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("foopy:3", proxy_info.proxy_server().ToURI()); 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No errors. 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error_observer->GetOutput()); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, log.GetSize()); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, request_log.GetSize()); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that multiple instances of ProxyResolverV8Tracing can coexist and run 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// correctly at the same time. This is relevant because at the moment (time 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this test was written) each ProxyResolverV8Tracing creates its own thread to 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// run V8 on, however each thread is operating on the same v8::Isolate. 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, MultipleResolvers) { 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setup resolver0 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockHostResolver host_resolver0; 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddRuleForAddressFamily( 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "host1", ADDRESS_FAMILY_IPV4, "166.155.144.44"); 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_resolver0.rules() 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->AddIPLiteralRule("host1", "::1,192.168.1.1", std::string()); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddSimulatedFailure("host2"); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddRule("host3", "166.155.144.33"); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddRule("host5", "166.155.144.55"); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddSimulatedFailure("host6"); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddRuleForAddressFamily( 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "*", ADDRESS_FAMILY_IPV4, "122.133.144.155"); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver0.rules()->AddRule("*", "133.122.100.200"); 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver0( 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &host_resolver0, new MockErrorObserver, NULL); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver0, "dns.js"); 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setup resolver1 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver1( 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &host_resolver0, new MockErrorObserver, NULL); 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver1, "dns.js"); 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setup resolver2 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver2( 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &host_resolver0, new MockErrorObserver, NULL); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver2, "simple.js"); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setup resolver3 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockHostResolver host_resolver3; 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_resolver3.rules()->AddRule("foo", "166.155.144.33"); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing resolver3( 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &host_resolver3, new MockErrorObserver, NULL); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitResolver(&resolver3, "simple_dns.js"); 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Queue up work for each resolver (which will be running in parallel). 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing* resolver[] = { 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &resolver0, &resolver1, &resolver2, &resolver3, 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t kNumResolvers = arraysize(resolver); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t kNumIterations = 20; 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t kNumResults = kNumResolvers * kNumIterations; 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback[kNumResults]; 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo proxy_info[kNumResults]; 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kNumResults; ++i) { 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t resolver_i = i % kNumResolvers; 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = resolver[resolver_i]->GetProxyForURL( 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://foo/"), &proxy_info[i], callback[i].callback(), NULL, 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoundNetLog()); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify all of the results. 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ------------------------ 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* kExpectedForDnsJs = 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "122.133.144.155-" // myIpAddress() 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null-" // dnsResolve('') 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "__1_192.168.1.1-" // dnsResolveEx('host1') 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null-" // dnsResolve('host2') 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.33-" // dnsResolve('host3') 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "122.133.144.155-" // myIpAddress() 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.33-" // dnsResolve('host3') 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "__1_192.168.1.1-" // dnsResolveEx('host1') 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "122.133.144.155-" // myIpAddress() 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "null-" // dnsResolve('host2') 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "-" // dnsResolveEx('host6') 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "133.122.100.200-" // myIpAddressEx() 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "166.155.144.44" // dnsResolve('host1') 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ":99"; 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kNumResults; ++i) { 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t resolver_i = i % kNumResolvers; 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback[i].WaitForResult()); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string proxy_uri = proxy_info[i].proxy_server().ToURI(); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (resolver_i == 0 || resolver_i == 1) { 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kExpectedForDnsJs, proxy_uri); 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (resolver_i == 2) { 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("foo:99", proxy_uri); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (resolver_i == 3) { 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("166.155.144.33:", 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_uri.substr(0, proxy_uri.find(':') + 1)); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 1099